1.synchronized
当多个线程访问run方法,以排队的方式进行(这里的排队是按照cpu分配的顺序)
一个线程想要执行synchronize修饰的方法里面的代码:
1.尝试获得锁
2.如果拿到锁,执行同步区内的代码,否则一直尝试去拿锁
多线程竞争锁2.多个线程多个锁
非静态方法一个对象一把锁
静态方法前面的synchronized锁的是Class而不是对象
synchronized取得的锁都是对象锁。而不是把一段代码当做锁。
有一种情况则是相同的锁,即在静态方法上面加syn关键字,表示锁定的是class类
3.对象锁的同步和异步
同步的概念就是共享,如果不是共享的资源就没必要同步
同步的目的为了线程安全:
原子性
可见性
两个线程,一个调用对象的同步方法,一个调用对象的非同步方法
* t1线程先持有object对象的lock锁,t2线程可以以异步的方式调用对象的非同步方法
* t1线程先持有object对象的lock锁,t2线程如果要调用对象的同步方法则需要等待
4.锁重入
(1)同一个对象多个同步方法互相调用
一个线程获得对象锁之后,可以继续获得该对象其他同步方法的同步锁
(2)父子类同步方法调用
子类可以获取父类的同步锁
5.线程执行异常
为了避免线程继续执行导致的各种不一致问题,需要及时退出线程
throw RuntimeException();
6.常量锁
(1).最好不要用常量锁,因为会导致死锁,常量在栈中是同一把锁
(2)字符串类锁,最好不要修改锁的值,否则会出现锁修改导致不同步
(3)对象锁,修改对象中的某个属性的值,不会引发对象锁更改
网友评论