JVM自带的一种锁,原理是字节码上通过monitorenter和monitorexit修饰
(1)是一个关键字,用于代码块的修饰,方法的修饰;
①修饰代码块:给指定对象加锁,进入代码块之前需要先获取该对象的锁;
②修饰普通实例方法:给当前类的对象加锁,进入同步代码前要获得当前对象实例的锁;
③修饰静态方法:也就是给当前类加锁,会作用于类的所有对象实例;(访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。)
(2)锁会自动释放,不会产生死锁;
(3)JDK6中synchronized加入了自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁等一系列优化,在较少并发的情况下,效率高一些;
Lock是JDK中的一个接口
(1)支持超时机制;
(2)锁需要手动unLock()释放;
(3)ReentrantLock能够保证公平性(保证公平会降低一部分效率,需要判断有没有前节点);
(3)大量线程同时竞争,ReentrantLock要远胜于synchronized。
Update your browser to view this website correctly. Update my browser now