浅谈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中,默认开启了锁升级优化策略。

相关文章
|
1天前
|
存储 安全 Java
【亮剑】Java并发编程中的四个关键字:ThreadLocal、Volatile、Synchronized和Atomic
【4月更文挑战第30天】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制。`ThreadLocal`为每个线程提供独立变量副本;`Volatile`确保变量可见性,但不保证原子性;`Synchronized`实现同步锁,保证单线程执行;`Atomic`类利用CAS实现无锁并发控制。理解其原理有助于编写高效线程安全代码。根据业务场景选择合适机制至关重要。
|
1天前
|
Java 程序员 开发者
深入理解Java并发编程:线程同步与锁机制
【4月更文挑战第30天】 在多线程的世界中,确保数据的一致性和线程间的有效通信是至关重要的。本文将深入探讨Java并发编程中的核心概念——线程同步与锁机制。我们将从基本的synchronized关键字开始,逐步过渡到更复杂的ReentrantLock类,并探讨它们如何帮助我们在多线程环境中保持数据完整性和避免常见的并发问题。文章还将通过示例代码,展示这些同步工具在实际开发中的应用,帮助读者构建对Java并发编程深层次的理解。
|
1天前
|
安全 Java 编译器
【Java EE】总结12种锁策略以及synchronized的实现原理
【Java EE】总结12种锁策略以及synchronized的实现原理
|
2天前
|
Java
【专栏】Java 中的锁是什么意思,有哪些分类?
【4月更文挑战第28天】Java多线程中,锁用于控制共享资源访问,确保数据一致性和正确性。本文探讨锁的概念、作用及分类:乐观锁与悲观锁、自旋锁与适应性自旋锁、公平锁与非公平锁、可重入锁和读写锁。使用锁需注意避免死锁、合理选择锁粒度及性能优化。理解锁有助于提升多线程编程的效率和稳定性。
|
2天前
|
Java 编译器
Java并发编程中的锁优化策略
【4月更文挑战第28天】在Java并发编程中,锁是一种常用的同步机制,用于保护共享资源的访问。然而,不当的使用锁可能导致性能问题和死锁。本文将探讨Java中锁的优化策略,包括锁粗化、锁消除、锁降级以及读写锁等技术,以提高并发程序的性能和可靠性。
|
4天前
|
安全 Java
【JAVA】Java并发编程中的锁升级机制
【JAVA】Java并发编程中的锁升级机制
|
缓存 Java 编译器
从Java 8升级到Java 11的注意事项
虽然Java最新版本已经发展到Java 18了,但市面上大部分的项目还在使用Java 8。由于从Java 8之后,Java API不一定向前兼容,因此很多人都对升级Java版本心存顾虑。Java 11是Java 8的下一个长期支持版本,毫无疑问Java 11比Java 8更加优秀。
2066 0
|
4天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
1天前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
2天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如