浅谈Java的synchronized 锁以及synchronized 的锁升级

简介: 浅谈Java的synchronized 锁以及synchronized 的锁升级

在Java中,synchronized关键字用于实现线程间的同步,确保同一时刻只有一个线程能够访问被同步的代码块或方法。当一个线程获得synchronized锁定后,其他试图访问同一锁的线程将被阻塞,直到锁被释放。

synchronized锁有两种基本形式:

  1. 同步方法:通过在方法声明前加上synchronized关键字,整个方法体被保护,同一时间内只能有一个线程访问该方法。
public class MyClass {
    public synchronized void synchronizedMethod() {
        // 执行同步代码...
    }
}
  1. 同步代码块:通过synchronized(object)的方式指定一个对象作为锁,只有持有该锁的线程才能执行同步代码块。
public class MyClass {
    private Object lock = new Object();
    
    public void synchronizedBlock() {
        synchronized (lock) {
            // 执行同步代码...
        }
    }
}

synchronized锁的升级机制是Java虚拟机(JVM)为了提高并发性能而引入的一种优化措施,它发生在HotSpot虚拟机中,主要包括以下四种状态:

  1. 无锁状态:对象未被任何线程锁定。
  2. 偏向锁(Biased Locking):当只有一个线程访问同步代码块时,会偏向于该线程,仅记录该线程ID,后续该线程进入同步代码块时无需再进行加锁操作。
  3. 轻量级锁(Lightweight Locking):当第二个线程尝试获取偏向锁时,偏向锁失效,转变为轻量级锁。轻量级锁通过CAS(Compare and Swap)操作尝试获取锁,如果获取失败(即已经有其他线程持有了锁),会进行自旋(spin)尝试,短时间内不停尝试获取锁,减少上下文切换的开销。
  4. 重量级锁(Heavyweight Locking):如果自旋一定次数后仍无法获取锁,轻量级锁会膨胀为重量级锁,此时会挂起当前线程,使其进入阻塞状态,等待锁持有者释放锁。重量级锁会消耗更多的系统资源,但它能保证公平性和互斥性。
  5. 4种状态的转换关系如下图所示:

这种锁升级机制旨在减少不必要的上下文切换,从而提高程序在多线程环境下的执行效率。在Java 6及以后版本的HotSpot JVM中,默认开启了锁升级优化策略。

相关文章
|
14天前
|
缓存 Java
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
本文介绍了几种常见的锁机制,包括公平锁与非公平锁、可重入锁与不可重入锁、自旋锁以及读写锁和互斥锁。公平锁按申请顺序分配锁,而非公平锁允许插队。可重入锁允许线程多次获取同一锁,避免死锁。自旋锁通过循环尝试获取锁,减少上下文切换开销。读写锁区分读锁和写锁,提高并发性能。文章还提供了相关代码示例,帮助理解这些锁的实现和使用场景。
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
|
16天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
21天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
39 2
|
1月前
|
Java
Java 中锁的主要类型
【10月更文挑战第10天】
|
22天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
12 0
|
1月前
|
安全 Java 开发者
java的synchronized有几种加锁方式
Java的 `synchronized`通过上述三种加锁方式,为开发者提供了从粗粒度到细粒度的并发控制能力,满足了不同场景下的线程安全需求。合理选择加锁方式对于提升程序的并发性能和正确性至关重要,开发者应根据实际应用场景的特性和性能要求来决定使用哪种加锁策略。
20 0
|
1月前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
37 0
|
缓存 Java 编译器
从Java 8升级到Java 11的注意事项
虽然Java最新版本已经发展到Java 18了,但市面上大部分的项目还在使用Java 8。由于从Java 8之后,Java API不一定向前兼容,因此很多人都对升级Java版本心存顾虑。Java 11是Java 8的下一个长期支持版本,毫无疑问Java 11比Java 8更加优秀。
2177 0
|
12天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
8天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
28 9
下一篇
无影云桌面