1)Synchronized 同步锁
作用域:不同加锁方式对应不同作用域
1) 对象锁
当一个对象访问Synchronized方法时,锁类型为对象锁。
此时该对象不能同时访问类中其他Synchronized方法。若一个对象中有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,则其它线程不能同时访问这个对象中任何一个synchronized方法。
此外,不同对象实例的synchronized方法是不相干预的。也就是说,其它线程可以同时访问此类下的另一个对象实例中的synchronized方法;
2) 类锁 :对该类的所有对象实例起作用。
当对静态方法加锁时,锁类型为类锁。相当于给类加锁(synchronized.Class),静态方法被调用时(类名.方法名),会先检测调用类有没有持有锁,持有锁时,等待。
锁的底层实现:
使用一个monitor对象,由ObjectMonitor实现(C++代码)
Class字节码中
1)对象加锁时,使用monitorenter指令得到monitor对象。检查owner是否为空
monitorenter操作的目标一定是对象,类型是reference。Reference实际就是堆里的一个存放对象的地址。每个对象(reference)都有一个monitor对应。
2)方法加锁时
常量池中多了ACC_SYNCHRONIZED标示符。JVM就是根据该标示符来实现方法的同步的:当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,