java中2种锁的实现原理区别:
synchronized: 在软件层面依赖JVM,在jvm将class文件编译成字节码文件时添加monitorenter和monitorexit句柄来标识加锁的代码块
Lock: Lock书纯Java实现的,与底层的JVM无关。在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类(简称AQS)
synchronized机制:
首先需要明确的一点是:Java多线程的锁都是基于对象的,Java中的每一个非空对象都可以作为一个锁。
synchronized关键字锁具体表现为:锁对象和锁对象的class类;每个类可以有很多实例对象,不同实例对象的对象锁互不干扰,但每个类只有一个class对象,所有类只有一把公用锁。具体的代码表现为:
// 锁对象为对象实例(this)
public synchronized void method(){
// todo
}
// 锁对象为对象对应的Class实例,因为Class数据存在于永久代,因此静态方法锁相当于该类的一个全局锁
public static synchronized void