本文主要是介绍Java 关键字 Synchronized 与锁优化机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
与 ReentrantLock 区别
ReentrantLock 独有能力
-
类库层面的同步
-
等待可中断,持有锁的线程长期不释放锁的时候,等待的线程可以放弃等待。
-
可实现公平锁 ,按照申请锁的时间顺序获取锁,不过公平锁讲导致其性能的急速下降,明显影响吞吐量。
-
锁绑定多个条件,一个 ReentrantLock 可以同时绑定多个 Condition 对象,而 synchronized 与 notifyAll 配合之恶能实现一个隐含的条件
为什么保留 synchronized
- synchronized 是 Java 语法层面的同步,简单清晰
- Lock 需要主动释放锁
- JVM 在线程和对象元数据中记录了 synchronized 锁的相关信息,而 Lock 没有
底层实现
- 当方法内部使用 synchronized ,monitorenter 尝试获取对象的锁,monitorexit 用于释放锁;
第二个 monitorexit 用于处理程序可能发生的异常,由编译器自动生成,在发生异常时处理异常然后释放掉锁。
- 当 synchronized 修饰方法块时,是根据 ACC_SYNCHRONIZED 标志位去控制同步逻辑
public class Test3 {public void methodA(){synchronized (Test3.class){System.out.println(123);}}public static void main(String[]
这篇关于Java 关键字 Synchronized 与锁优化机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!