- 引入:StringBuffer与StringBuider区别
前者是多线程安全的,后者是非多线程安全的,但是效率更高。 - 进程与线程
进程:一个独立的程序执行过程。
线程:建立在进程的基础之上,一个进程由一个或者多个线程组成。
DeathThead test01 = new DeathThead();
DeathThead test02 = new DeathThead();
new Thread(test01::m1).start();
new Thread(test02::m2).start();
- 多线程优势与弊端
优势:并发执行,速度快。
劣势:需要控制变量操作为原子操作,否则会出现不同步。 - 锁:synchronize
互斥锁,锁定对象(或this),只有拿到锁,才能进行操作。
支持同步执行,同一线程的同一类可以拿多次,子类可以调用父类同步方法。
Object a = new Object();
Object b = new Object();
public void m1(){
synchronized (a) {
System.out.println("m1锁a");
}
try {
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (b){
System.out.println("m1锁b");
}
}
public synchronized void m2(){
}
synchronized线程出现异常默认会释放锁。
如果不想释放锁,需要添加trycatch方法。
如果在锁定过程中对象被重新创建,锁会被释放。
死锁
线程1需要先锁定A后锁定B,线程2需要先锁定B后锁定A。
线程1锁定了A,线程2锁定了B。
导致两个线程无法解锁,故称为死锁。
- volatile
线程之间的内存缓冲区彼此可见。
某一线程的cpu缓冲区读主内存数据->修改当前缓冲区数据->
修改主内存数据----------->通知其他线程cpu更新缓冲区内容。
替代方案:
1.使用synchronize
优点:同时保证可见性与原子性,
缺点:过于笨重,影响效率。
2.使用sleep
优点:简单,
缺点:不可靠
- 原子类与原子方法
Atomic...
incrementAndGet()
#相当于++
#效率高于synchronize,但方法有限。
#多个原子方法一起不一定具有原子性。
网友评论