一文读懂Synchronized的锁原理及其演变过程
2024-01-02 13:10:41
一、synchronized概述
synchronized是Java语言中的一个,用于实现多线程之间的同步。它可以确保在同一时刻,只有一个线程能够执行一段代码。synchronized可以修饰方法、代码块或对象。
二、synchronized的实现原理
在Java虚拟机(JVM)中,synchronized是通过一个叫做监视器锁(monitor lock)的机制来实现的。每个对象都有一个监视器锁,当一个线程想要执行一段synchronized代码时,它必须先获取该对象的监视器锁。如果监视器锁已经被另一个线程持有,那么当前线程必须等待,直到该线程释放监视器锁。
三、synchronized的演变
在JDK 1.6之前,synchronized被称为重量级锁。重量级锁的开销很大,因为它需要在内核态和用户态之间进行切换。为了减少synchronized的开销,JDK 1.6引入了偏向锁和轻量级锁。
- 偏向锁
偏向锁是一种非常轻量的锁,它只适用于没有竞争的场景。当一个线程第一次获取一个对象的锁时,JVM会将该对象的监视器锁标记为偏向锁,并将该线程标记为偏向线程。如果该线程一直持有该对象的锁,那么就不需要进行任何锁竞争。
- 轻量级锁
轻量级锁是一种比重量级锁更轻量的锁,它适用于竞争较少的场景。当一个线程第一次获取一个对象的锁时,JVM会将该对象的监视器锁标记为轻量级锁,并将该线程标记为轻量级线程。如果该线程一直持有该对象的锁,那么就不需要进行任何锁竞争。但是,如果另一个线程也试图获取该对象的锁,那么JVM就会将该对象的锁升级为重量级锁。
四、偏向锁、轻量级锁、重量级锁的对比
锁类型 | 开销 | 适用场景 |
---|---|---|
偏向锁 | 非常轻量 | 没有竞争的场景 |
轻量级锁 | 比重量级锁更轻量 | 竞争较少的场景 |
重量级锁 | 最重 | 竞争激烈的场景 |
五、synchronized的使用建议
- 在使用synchronized时,应该尽量避免使用全局锁。全局锁会影响所有线程的性能,即使这些线程并不需要访问被锁住的资源。
- 应该尽量使用偏向锁和轻量级锁,以减少synchronized的开销。
- 应该尽量避免在循环中使用synchronized,因为这会大大降低程序的性能。
- 应该尽量使用更高层次的并发控制机制,如java.util.concurrent包中的类,以简化并发编程的难度。
六、结语
synchronized是Java语言中非常重要的一个关键字,它可以用于实现多线程之间的同步。通过深入理解synchronized的实现原理、演变过程以及偏向锁、轻量级锁、重量级锁等概念,读者可以更好地掌握Java并发编程的知识,并提高程序的性能。