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

多线程锁的升级原理是什么?多线程锁的升级原理是什么?锁的级别从低到高:无锁->偏向锁->轻量级锁->重量级锁锁分级别原因:没有优化以前,sychronized是重量级锁(悲观锁),使用wait和notify、notifyAll来切换线程状态非常消耗系统资源;线程的挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。所以JVM对sychronized关键字进…

大家好,又见面了,我是你们的朋友全栈君。

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

锁的级别从低到高:

无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁

 

锁分级别原因:

没有优化以前,synchronized是重量级锁(悲观锁),使用 wait 和 notify、notifyAll 来切换线程状态非常消耗系统资源;线程的挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。所以 JVM 对 synchronized 关键字进行了优化,把锁分为 无锁、偏向锁、轻量级锁、重量级锁 状态。

 

无锁:没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功,其他修改失败的线程会不断重试直到修改成功。

 

偏向锁:对象的代码一直被同一线程执行,不存在多个线程竞争,该线程在后续的执行中自动获取锁,降低获取锁带来的性能开销。偏向锁,指的就是偏向第一个加锁线程,该线程是不会主动释放偏向锁的,只有当其他线程尝试竞争偏向锁才会被释放。

偏向锁的撤销,需要在某个时间点上没有字节码正在执行时,先暂停拥有偏向锁的线程,然后判断锁对象是否处于被锁定状态。如果线程不处于活动状态,则将对象头设置成无锁状态,并撤销偏向锁;

如果线程处于活动状态,升级为轻量级锁的状态。

 

轻量级锁:轻量级锁是指当锁是偏向锁的时候,被第二个线程 B 所访问,此时偏向锁就会升级为轻量级锁,线程 B 会通过自旋的形式尝试获取锁,线程不会阻塞,从而提高性能。

当前只有一个等待线程,则该线程将通过自旋进行等待。但是当自旋超过一定的次数时,轻量级锁便会升级为重量级锁;当一个线程已持有锁,另一个线程在自旋,而此时又有第三个线程来访时,轻量级锁也会升级为重量级锁。

 

重量级锁:指当有一个线程获取锁之后,其余所有等待获取该锁的线程都会处于阻塞状态。

重量级锁通过对象内部的监视器(monitor)实现,而其中 monitor 的本质是依赖于底层操作系统的 Mutex Lock 实现,操作系统实现线程之间的切换需要从用户态切换到内核态,切换成本非常高。

 

锁状态对比:

 

偏向锁

轻量级锁

重量级锁

适用场景

只有一个线程进入同步块

虽然很多线程,但是没有冲突:多条线程进入同步块,但是线程进入时间错开因而并未争抢锁

发生了锁争抢的情况:多条线程进入同步块并争用锁

本质

取消同步操作

CAS操作代替互斥同步

互斥同步

优点

不阻塞,执行效率高(只有第一次获取偏向锁时需要CAS操作,后面只是比对ThreadId)

不会阻塞

不会空耗CPU

缺点

适用场景太局限。若竞争产生,会有额外的偏向锁撤销的消耗

长时间获取不到锁空耗CPU

阻塞,上下文切换,重量级操作,消耗操作系统资源

 

部分内容摘自:

http://www.jetchen.cn/synchronized-status/

https://www.liangzl.com/get-article-detail-17940.html

 


【Java面试题与答案】整理推荐

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152032.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 浦发银行 信息科技岗 大数据方向 面经

    浦发银行 信息科技岗 大数据方向 面经浦发银行总行信息科技部(大数据方向)面试浦发银行总行信息科技部(大数据方向)面试8.6面试大家的面经浦发银行总行(上海)大数据岗8月6号面经一、综合面二、机试三、专业面试浦发面经即兴演讲上机测试结构化面试浦发银行大数据创新岗上海打卡第一部分综合面试第二部分专业面试第三部分上机考试(只有开发和测试岗需要,别的岗可选)浦发总行信息岗校招面经(上海…

    2022年5月5日
    163
  • atm异步传输模式特性_ATM是什么模式

    atm异步传输模式特性_ATM是什么模式AsynchronousTransferMode.  ATM是一种传输模式,在这一模式中,信息被组织成信元,因包含来自某用户信息的各个信元不需要周期性出现,这种传输模式是异步的。   ATM是网络新技术,它采用基于信元的异步传输模式和虚电路结构,根本上解决了多媒体的实时性及带宽问题。实现面向虚链路的点到点传输,它通常提供155Mbps的带宽。它既汲取了话务通讯中电路交换的“有连接”服务

    2022年9月21日
    3
  • jquery——zTree, 完美好用的树插件

    jquery——zTree, 完美好用的树插件

    2021年11月30日
    42
  • redis数据类型详解(redis数据类型及常用方法)

    文章目录string类型操作实践incr/incrbydecr/decrbyincrbyfloatappendstrlenmset/mget小节面试分析Key有效时间设计Expire(设置生效时长-单位秒)Persist(取消时长设置)pexpire(单位毫秒)小节面试分析Hash类型应用实践问题hset/hgethincrbyhmset/hmgethexistshdelhkeys/hvals小节面试分析List类型应用实践问题lpushrpush查看listlinsertlsetlremltriml

    2022年4月10日
    57
  • 进程间通讯的7种方式是_第一种形态有哪些方式

    进程间通讯的7种方式是_第一种形态有哪些方式**1、常见的通信方式**管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流…

    2022年10月11日
    4
  • 此视频无法播放0xc00d36c4_视频播放失败代码-30

    此视频无法播放0xc00d36c4_视频播放失败代码-30相信很多用户都遇到过视频无法播放的问题。比如将重要视频从旧电脑拷到U盘上,使用另一台电脑播放时,提示视频播放错误代码0xc00d36c4,不支持该视频播放。其实,视频无法播放的问题是很常见的,不少用户在电脑上连接相机或者手机后播放视频,也会提示0xc00d36c4。出现这样的问题要怎么解决,怎么才能修复该视频文件使其正常播放?播放MP4格式视频显示错误代码0xc00d36c4的情况大多数情况下,…

    2022年9月29日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号