首页 > 编程语言 >java并发之synchronized

java并发之synchronized

时间:2022-10-13 18:55:59浏览次数:48  
标签:word synchronized 升级 并发 线程 java 轻量级

java实现同步互斥访问有两种方式,synchronized和Lock。

Sychronized是java实现的内置锁,由jvm实现。通过编译Synchronized代码块为字节码可以发现,加锁逻辑被翻译为monitorenter和monitorexit两条指令。Synchronized是对象锁,锁的是monitor对象,对于锁的实现这里不再解释,其由jvm实现,实现原理reentrantlock的原理类似,都是获取不到锁,线程会被挂起在一个队列中。

1、编译字节码

javap -verbose Xxx

注:Xxx为字节码文件,不需要带.class

2、例子

 

可以看出同步代码快的上下被monitorenter和monitorexit两条指令包裹,分别代表加锁和解锁。

 

同时,synchronzed的在1.5版本后还有以一个大优化,就是锁的膨胀升级。在早期版本,synchronized会直接加一把重量级锁。等待锁的线程会被挂起,线程的挂起和激活涉及到从用户态和内核态之间的转换,耗时耗力。在新版本中,synchronized提供了三层锁的升级,从无锁--》偏向锁--》轻量级锁--》重量级锁。

1、锁标识

java对象头中有一段Mark word区域,在锁膨胀的过程中,这段空间会标识不同的含义。

 

 2、synchronized锁升级过程

 当线程a来争夺锁的时候,首先对象升级为偏向锁。线程a通过cas操作尝试将锁对象的mark word的线程id设置为自己。

如果a还没释放锁的时候,线程b来争夺锁。b通过cas尝试获取锁,失败后,b会申请将锁升级为轻量级锁。线程a会找一个程序安全点,暂停线程,将锁升级为轻量级锁。线程a会将mark word的值拷贝到线程栈中,并且将锁对象的mark word修改为指向其线程栈中锁记录的指针。

此时线程b会通过自旋来尝试获取锁,若一定次数没有获取,就会申请将锁升级为重量级锁,同时进入阻塞状态。等线程a释放锁后,再将线程b唤醒,开启一段新的锁争夺。

 

标签:word,synchronized,升级,并发,线程,java,轻量级
From: https://www.cnblogs.com/wzllzw/p/16789300.html

相关文章

  • JAVA 多线程
    JVM:1.虚拟机栈和程序计数器每个线程会单独生成2.方法区和堆是多线程共享的 多线程优点: 1、提高计算机系统CPU的利用率2、将既长又复杂的进程分为多个线程,独立运......
  • Java在PDF文档中添加或删除页面
    前言当你编辑一个PDF文档时,有时需要删除文档中多余的页面或向文档中添加新的页面。本文将向您演示如何使用Spire.PDFforJava在PDF文档中添加或删除页面。 程序环境......
  • Java并发编程学习5-对象的组合
    对象的组合前面的博文,我们已经了解了关于线程安全和同步的一些基础知识。本篇博文将介绍一些线程安全的组合模式,来帮助我们确保使用这些模式开发的程序是线程安全的。1.......
  • MySQL——MVCC--多版本并发控制机制
    前言以下的分析均在mysql的InnoDB引擎下。假设此时事务A与事务B同时执行。一、定义:MVCC(Multi-VersionConcurrencyControl,多版本并发控制)一种并发控制机制,在数据库中用......
  • MySQL——并发insert on duplicate key update遇见死锁
    前言数据库死锁问题,是一个老生常谈且很常见的问题,网上也有非常多对于各类死锁场景的解析和复现,但凡和死锁有关,无外乎不涉及数据库隔离等级、索引、以及innodb锁等相关原因......
  • 入门学习Java必须明确的几点
    在现在对于任何人来说,学一个东西从入门到精通都是需要有一个过程的,我们才能慢慢的掌握。同样学Java也是如此,学到精通必然会得到一份高薪的工作。所以对于任何一个零基础小白......
  • java根据模板excel导出pdf和excel (easypoi)示例
    /***下载带模板的excel*@paramresponse*@parammap数据mapkey需与模板中对应*@paramtemplateUrl模板excel路径*@param......
  • java并发之volatile
    java并发围绕原子性、可见性和有序性展开。volatile可以保证可见性。在说volatile前,需要了解几个概念。1、JMM(javamemorymodel)JMM是个抽象的概念,他是java对底层操作系......
  • 《大话设计模式 Java溢彩加强版》相关主题
    《大话设计模式Java溢彩加强版》读者须知     《大话设计模式Java溢彩加强版》在2022年10月在各大网上书店中有售!源代码与课件下载 《大话设计模式Java溢彩......
  • Java并发(线程状态、线程调度、线程同步)
    Java并发(线程状态、线程调度、线程同步)线程状态​ 线程共有5种状态,在特定情况下,线程可以在不同的状态之间切换。5种具体状态创建状态:实例化一个新的线程对象,还未启......