Synchronized原理
synchronized -- 对象加锁
在字节码中,使用monitorenter/monitorexit 来控制同步的范围。
所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数。【如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候, 计数变为1。
每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。 只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。每当任务离开时,计数递减,当计数为0的时候,锁被完全释放。】
由此可以得出,synchronized原理是基于栈中的某一对象来控制的。所以【锁对象而不是锁方法是常用的synchronized的优化方法】
synchronized -- 方法锁
实际上,synchronized锁的是“this”.