首页 > 编程语言 >java中多线程synchronized锁升级的原理是什么?

java中多线程synchronized锁升级的原理是什么?

时间:2023-07-03 11:07:20浏览次数:53  
标签:状态 java synchronized CAS 对象 线程 JVM 多线程 轻量级

在Java中,synchronized关键字用于实现线程之间的同步,确保多个线程对共享资源的访问是有序的。当一个线程获取到对象的锁时,其他线程将被阻塞,直到该线程释放锁。

Java中的锁升级是指JVM对synchronized锁的优化过程。为了提高程序的性能,JVM使用了不同的锁状态。具体的锁状态如下:

  1. 无锁状态(Unlocked):当一个线程访问一个对象时,并没有其他线程对该对象进行锁定。
  2. 偏向锁状态(Biased):当一个线程访问一个对象时,JVM会将对象头中的标记设置为该线程的标识。这时候其他线程访问该对象时,无需进行同步操作,提高了程序的性能。
  3. 轻量级锁状态(Lightweight):在多个线程访问同一个对象时,会进入轻量级锁状态。当线程获取到锁时,使用CAS(Compare and Swap)操作将对象的标记修改为线程的标识。若CAS操作失败,说明有其他线程竞争锁,会膨胀为重量级锁。
  4. 重量级锁状态(Heavyweight):在轻量级锁状态下,如果CAS操作失败,锁会膨胀为重量级锁。在重量级锁状态下,锁的竞争通过操作系统的互斥量来实现,涉及到用户态和内核态之间的切换。

锁升级的原理是根据对象的访问情况和竞争情况自动升级锁的状态,以提高程序的性能。当一个线程进入同步块时,JVM会尝试将锁升级到偏向锁状态。如果有其他线程竞争该锁,锁会进入轻量级锁状态,通过CAS操作来保证对对象的原子操作。如果轻量级锁状态下CAS操作失败,锁会膨胀为重量级锁,确保线程安全。

锁的升级过程并不是一定的,JVM会根据实际情况进行优化和选择。锁升级是一种动态优化策略,旨在在保证线程安全的前提下,尽可能减少锁竞争带来的性能损耗。

标签:状态,java,synchronized,CAS,对象,线程,JVM,多线程,轻量级
From: https://blog.51cto.com/u_16095802/6609491

相关文章

  • c++实现多线程消息通信队列
    #ifndef_SYNC_SIMPLEQUEUE_QUEUE_HPP_#define_SYNC_SIMPLEQUEUE_QUEUE_HPP_#include<queue>usingnamespacestd;namespaceutility{template<typenameT>classSyncSimpleQueue{public:voidput(constT&msg){std::uniqu......
  • java对象的内存布局
    写java时不管是我们自己new对象还是spring管理bean,尽管我们天天跟对象打交道,那么对象的结构和内存布局有多少人知道呢,这篇文章可带你入门,了解java对象内存布局。本文涉及到JVM指针压缩的知识点,不熟悉的小伙伴可以看前面写过的一篇关于指针压缩的文章。JVM之指针压缩首先说明,本......
  • 狂收 3K Star!一个高性能、无侵入的 Java 性能监控和统计工具,十分强悍!
    背景随着所在公司的发展,应用服务的规模不断扩大,原有的垂直应用架构已无法满足产品的发展,几十个工程师在一个项目里并行开发不同的功能,开发效率不断降低。于是公司开始全面推进服务化进程,把团队内的大部分工程师主要精力全部都集中到服务化中。服务化可以让每个工程师仅在自己负......
  • java中的BO根DTO的区别以及使用场景
    java中的BO根DTO的区别以及使用场景  BO(BusinessObject)业务对象BO就是PO(PersistantObject)的组合简单的例子比如说PO是一条交易记录,BO是一个人全部的交易记录集合对象复杂点儿的例子PO1是交易记录,PO2是登录记录,PO3是商品浏览记录,PO4是添加购物车记录,PO5是搜索记录,BO是个......
  • 获取系统时间在java中怎么操作,还可以指定格式
    ​ 要在Java中获取当前时间并将其格式化为指定形式,可以使用java.time包中的LocalDateTime和DateTimeFormatter类。下面是一个示例代码,演示如何获取系统时间并将其格式化为指定的字符串格式: importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;p......
  • 获取系统时间在java中怎么操作,还可以指定格式
    ​ 要在Java中获取当前时间并将其格式化为指定形式,可以使用java.time包中的LocalDateTime和DateTimeFormatter类。下面是一个示例代码,演示如何获取系统时间并将其格式化为指定的字符串格式: importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;p......
  • 如何在JavaScript中使用Promise.allSettled()
    您是否曾经在JavaScript中使用过Promise,并且当有人拒绝并毁掉一切时感到沮丧?你编写了一些基于Promise的代码,一切都进展顺利,然后繁荣——一个小小的Promise被拒绝,整个链条就会崩溃。你的代码逐渐停止,你想知道为什么JavaScript不能忽略这个小问题并继续它的快乐之路。好......
  • Java|Spring Boot 一些名词和常用概念(1)
    JVMJVM(JavaVirtualMachine)is anabstractmachinethatenablesyourcomputertorunaJavaprogram.WhenyouruntheJavaprogram,JavacompilerfirstcompilesyourJavacodetobytecode.Then,theJVMtranslatesbytecodeintonativemachinecode(set......
  • 6Javaweb基础—尚硅谷(购物车模块,订单模块) 没有做完
                               ......
  • java基础()
    计算机高级语言语言的类型有2中,编译型和解释型,Java是2种语言的结合。Java程序的运行机制:   1.javac Hello.java(文件名和类名要相同)生成Hello.class文件之后2.javaHello(不要写.class  java命令会调用虚拟机进行运行)----------------------------------------......