synchronized、lock

水深无声 2023-09-30 09:46 120阅读 0赞

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

发表评论

表情:
评论列表 (有 0 条评论,120人围观)

还没有评论,来说两句吧...

相关阅读