synchronized、lock
1、两个线程同时访问一个对象的相同的synchronized方法
同一实例拥有同一把锁,其他线程必然等待,顺序执行
不同的实例拥有的锁是不同的,所以不影响,并行执行
2、两个线程同时访问两个对象的相同的static的synchronized方法
静态同步方法,是类锁,所有实例是同一把锁,其他线程必然等待,顺序执行
3、两个线程同时访问同一对象的synchronized方法与非synchronized方法
非synchronized方法不受影响,并行执行
4、两个线程访问同一对象的不同的synchronized方法
同一实例拥有同一把锁,所以顺序执行(说明:锁的是this对象==同一把锁)
5、两个线程同时访问同一对象的static的synchronized方法与非static的synchronized方法
static同步方法是类锁,非static是对象锁,原理上是不同的锁,所以不受影响,并行执行
6、方法抛出异常后,会自动释放锁,Lock需要显示的释放锁
核心:
一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待
每个实例都对应有自己的一把锁,不同的实例之间互不影响;
无论是方法正常执行完毕还是方法抛出异常,都会释放锁
11、synchronized关键字注意点:
锁对象不能为空、作用域不宜过大、避免死锁
12、如何选择Lock和synchronized关键字?
尽量优先使用java.util.concurrent各种类(不需要考虑同步工作,不容易出错)
优先使用synchronized,这样可以减少编写代码的量,从而可以减少出错率
若用到Lock或Condition独有的特性,才使用Lock或Condition
还没有评论,来说两句吧...