synchronized关键字
总结:1.synchronized修饰方法上
2.synchronized修饰在代码块上
(1)修饰对象
(2)修饰类
遇到synchronized同步锁所有情况
(1)作用在同一个实例对象上,两个线程,
一个线程调用synchronized修饰的方法(锁在本类对象上)
另一个线程可以调用非synchronized修饰的方法,
两个线程互不影响,并行,异步
(2)作用在同一个实例对象上,
两个线程都调用synchronized修饰的方法(锁在本类对象上)
两个线程同步,串行
(3)作用在两个实例对象,
分别调用同一个synchronized修饰的方法(锁在两个不同的对象上)
并行,异步
(4)作用在同一个实例对象上,
一个线程调用synchronized修饰的代码块(锁在本类对象上),
一个线程调用没有synchronized修饰的代码块,互不影响,并行,异步
(5)作用在同一个实例对象上,
两个线程,都调用synchronized修饰的代码块(两个都锁在同一个对象上),
两个线程同步,串行
(6)两个实例对象,分别调用同一个synchronized修饰的代码块
并行,异步
(7)作用同一个实例对象上,两个线程,
一个线程调用synchronized修饰的方法(锁在本类对象上)
另一个线程调用synchronized修饰的代码块(锁在本类对象),两个线程同步,串行
(8)作用在同一个实例对象上,三个线程,
第一个线程调用synchronized修饰的方法(锁在本类对象上),
第二个线程调用synchronized修饰的代码块(锁在本类对象),
第三个线程调用synchronized修饰的代码块(锁在Object对象上)
则三个线程,第三个线程与(第二个线程和第三个线程)并行
第二个线程和第一个线程同步,串行执行
(9)作用在同一个实例对象上,三个线程
第一个线程调用synchronized修饰的方法(锁在Object对象上),
第二个线程调用synchronized修饰的代码块(锁在本类对象),
第三个线程调用synchronized修饰的代码块(锁在 new Object对象上和第一个不是同一个Object);
则,三个线程异步,并行执行
以上都是作用在对象上的,接下来锁在类上
(10)作用在同一个类上,
一个线程调用的方法是(给方法加synchronized static 锁在本类上)
另一个线程调用的是代码块(synchronized(本类))
两个线程同步,串行执行
(11)一个线程调用的是给对象加锁,一个线程调用的是给类加锁,两把锁是不同的锁
所以两个线程互不影响应该为异步,并行执行
synchronized同步锁出现的所有情况,整理总结
最新推荐文章于 2021-02-16 18:48:40 发布