synchronized锁机制详解

synchronized关键字用在方法签名上或者代码块上,用于给资源加锁。不过这个锁的粒度并不限于这个方法或者代码块。它是“对象级别的锁”。

这个所谓的“对象级别的锁”那底是什么意思呢? 也就是说,当一个线程持有这个锁时,访问同一个对象的另一个线程倒底会受到什么影响?

经实验,结论如下:

1. 当一个线程在执行一个synchronized方法时,另一个线程无法立即执行同一个对象的相同方法,也不能执行这个对象的其他任意一个synchronized方法。这就是“对象级别锁”的意义。

2. 当一个线程在执行一个synchronized方法时,另一个线程可以立即执行同一个对象的任意一个synchronized方法

3. 当一个线程在执行一个synchronized代码块时,另一个线程无法立即执行同一个对象的任意一个synchronized方法,但可以立即执行同一个对象的任意一个synchronized方法

4. 当一个线程在执行一个synchronized代码块时,另一个线程无法立即执行施加在同一个对象的任意一个synchronized代码块

5. 当一个线程在执行一个synchronized代码块时,另一个线程可以立即执行施加在同一个对象的任意一个synchronized代码块,即使后者与前者调用了相同的方法

可以看出,synchronized代码块和synchronized方法基本上是对等的。那么,当一个线程在执行一个synchronized方法时,另一个线程是否能够立即执行施加在同一个对象的一个syncrhonized代码块? 答案是显然的。

总之,在同一个对象内,synchronized和非synchronized的资源不会彼此阻塞访问,只有synchronized和synchronized的资源会互相阻塞访问

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.