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的资源会互相阻塞访问