常见的几种锁
Synchroniezd
类中全部是 当修饰在非静态方法时,
多个线程用一个对象,锁的就是对象this,其他线程是不能进入此对象调用修饰了Synchroniezd的方法,多线程调用普通方法不收影响
并且多个线程用不同对象,不同对象的锁不同, 不会出现争抢锁
类中全部是 当修饰在静态方法时
锁就变成了类锁,不同对象的调用的锁是同一吧,如果此时调用的方法 都被static修饰了 那同一时刻,只有一个方法在进行
类中 有 普通 静态 非静态修饰的Synchroniezd时
这个时候 类和对象锁 是两把锁,并不冲突
从字节码层面来看 sync 里 monitorenter与monitorexit 的比例有可能是1:1或1:2
sync修饰的方法中 有throw new exception 的话 可能会1:1 并且有两个throw
字节码文件中 flags: 通过ACC_STATIC 来区别sync修饰的是是否是静态方法
ReentrantLock