并发-synchronized详解

这篇具有很好参考价值的文章主要介绍了并发-synchronized详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JDK1.6之前的synchronized关键字一来就直接给对象加了一把重量级锁,频繁地在用户态和内核态之间切换,导致性能非常低。为了弥补synchronized的不足,大佬doug lee写了一个AQS框架,用Java语言实现了ReentrantLock。然后在JDK1.6之后,oracle优化了synchronized的锁过程,增加了锁的膨胀逻辑。当没有线程来调用synchronized修饰的代码时,synchronized为无锁态,当有一个线程调用时,synchronized由无锁态升级为偏向锁,当有多个线程都调用这块代码时,就会从偏向锁升级到轻量锁状态,这是没有获取到锁的线程就会进行自旋以获取锁。如果自旋太久一直没有获取到锁,就会升级为重量级锁。这个锁的膨胀过程大大提升了synchronized的性能。

对象锁


sy在JDK1.6之前:new Object();的时候jvm天然地维护一个管程monitor,monitor依赖底层的操作系统Mutex【互斥量】,mutex是由操作系统维护的【调操作系统的线程库Pthread】------------------------------为什么效率低呢?涉及到用户态与内核态之间的切换所以效率很低

基于sy锁太重影响性能的前提

开发出ReentrantLock锁,是基于java写的java类归于AQS框架。ReentrantLock可重入、公平性

oracle优化了synchronized的锁过程:
所以JDK1.6及之后,要是锁被一个线程占了,后面的线程就会自旋等待【不需要让出CPU的使用权,一直占着CPU】,浪费一点CPU资源,比阻塞自己回头等另外线程唤醒的效率高的多
只有重量级锁会依赖管程monitor
并发-synchronized详解,并发,java

sy加锁

sy加在静态方法,锁是加在Class类上
sy加在普通方法,锁加在this,加在当前对象上
new 一个实例对象,对象锁

在同步代码块上sy(object)加锁:monitorenter和monitorexist【有几个,避免发生异常,不释放锁】
在方法上加锁public static synchorized void decrStock(){} 在翻译字节码后会给方法的修饰符加上ACC_synchorized 一标志,这个标志会触发JVM 底层给代码块加monitorenter和monitorexist
对象怎么记录锁的状态的呢

并发-synchronized详解,并发,java
对象的内存多大:8字节的整数倍
并发-synchronized详解,并发,java

对象锁的状态就记录在Mark Word,Mark Word大小为4字节大小,32比特大小【32位虚拟机,64位的话也会进行指针压缩】
并发-synchronized详解,并发,java
匿名偏向—>加入sy对象锁就会偏向锁,并且有指向哪个线程的记录---->多个线程抢3同一把锁的话就会转为轻量级锁---->当自旋等待的时间过长的话就会升级为重量级锁

当对象可偏向时:markword将变成未锁定状态 并只能升级为轻量级锁
当对象正处于偏向锁时,调用hashcode将使偏向锁强制升级成重量级锁

在加锁的情况下,且处于偏向锁,这时候调用方法要回去hashcode,锁就会升级为轻量级锁,因为偏向锁没有记录hasdcode的地方,升级到轻量级锁后,mark word除了锁状态的其余部分会保存一个指针,指向一个地方,该地址保存初始状态的mark word 信息。如下图![并发-synchronized详解,并发,java
【稍微更改】注意:调用hashcode方法的时候,就进入无锁,再次进入会升级为轻量级锁
重量级锁hashcode存在管程里
并发-synchronized详解,并发,java
并发-synchronized详解,并发,java

并发-synchronized详解,并发,java

\文章来源地址https://www.toymoban.com/news/detail-522842.html

到了这里,关于并发-synchronized详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java并发编程(三)线程同步 上[synchronized/volatile]

    当使用多个线程来访问同一个数据时,将会导致数据不准确,相互之间产生冲突,非常容易出现线程安全问题,比如多个线程都在操作同一数据,都打算修改商品库存,这样就会导致数据不一致的问题。 所以我们通过线程同步机制来保证线程安全,加入同步锁以避免在该线程没有完成

    2024年02月13日
    浏览(30)
  • Java并发之synchronized关键字和Lock接口

    欢迎点赞阅读,一同学习交流,有疑问请留言 。 GitHub上也有开源 JavaHouse,欢迎star 当开发过程中,我们遇到并发问题。怎么解决? 一种解决方式,简单粗暴:上锁。将千军万马都给拦下来,只允许一个人过独木桥。书面意思就是将并行的程序变成串行的程序。现实的锁有门锁

    2024年02月08日
    浏览(33)
  • 【Java|多线程与高并发】线程安全问题以及synchronized使用实例

    Java多线程环境下,多个线程同时访问共享资源时可能出现的数据竞争和不一致的情况。 线程安全一直都是一个令人头疼的问题.为了解决这个问题,Java为我们提供了很多方式. synchronized、ReentrantLock类等。 使用线程安全的数据结构,例如ConcurrentHashMap、ConcurrentLinkedQueue等

    2024年02月09日
    浏览(32)
  • java线程-synchronized详解

    解决线程原子性问题,最常见的手段就是加锁,Java提供了两种加锁的方式,一个synchronized隐式锁,另外一个是通过J.U.C框架提供的Lock显式加锁。本文主要介绍一个Synchronized的实现方式。 synchronized解决的是多个线程之间访问资源的同步性,synchronized 翻译为中文的意思是

    2024年02月10日
    浏览(38)
  • Java 关键字:synchronized详解

    Java中的synchronized用于在多线程环境下确保数据同步。它可以用来修饰方法和代码块 当一个线程访问一个对象的synchronized方法或代码块时,其他线程将无法访问该对象的其他synchronized方法或代码块。这样可以确保在同一时间只有一个线程能够执行该代码块或方法,避免

    2024年02月08日
    浏览(40)
  • Java多线程(二)——synchronized 详解

    目录 1 volatile 1.1保证变量可见性 1.2 不能保证数据的原子性举例 1.3 禁止JVM指令重排序 2 synchronized 2.1 概念及演进 2.2 对象锁和类锁 2.3 synchronized 的用法分类 2.4 synchronized 的用法详解 2.5 synchronized总结+补充 3 synchronized 底层原理 3.1 synchronized 同步语句块的情况

    2024年02月13日
    浏览(30)
  • Java-synchronized实现详解(从Java到汇编)

    synchronized作为java语言中的并发,其在代码中出现的频率相当高频,大多数开发者在涉及到并发场景时,一般都会下意识得选取synchronized。 synchronized在代码中主要有三类用法,根据其用法不同,所获取的锁对象也不同,如下所示: 修饰代码块:这种用法通常叫做同步代

    2024年02月01日
    浏览(26)
  • Java关键字之synchronized详解【Java多线程必备】

    点击   Mr.绵羊的知识星球  解锁更多优质文章。 目录 一、介绍 二、特性 1. 线程安全 2. 互斥访问 3. 可重入性 4. 内置锁 三、实现原理 四、和其他锁比较 1. 优点 2. 缺点 五、注意事项和最佳实践 六、使用案例 1. 案例一 2. 案例二     synchronized是Java中最基本的同步机制之一,

    2024年01月24日
    浏览(38)
  • 并发——synchronized 关键字

    synchronized 解决的是多个线程之间访问资源的同步性, synchronized 可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中, synchronized 属于 重量级锁 ,效率低下。 为什么呢? 因为监视器锁(monitor)是依赖于底层的操作系

    2024年02月13日
    浏览(27)
  • 没有synchronized,rust怎么防并发?

    学过Java的同学对synchronized肯定不陌生,那么rust里怎么办呢? 在Rust中,可以使用标准库提供的 std::sync::Mutex 来实现加锁功能。Mutex是互斥锁的一种实现,用于保护共享数据在并发访问时的安全性。 下面是一个简单的示例代码,展示了如何在Rust中使用Mutex进行加锁: 在上述代

    2024年02月13日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包