synchronized、lock 水深无声 2023-09-30 09:46 29阅读 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
还没有评论,来说两句吧...