• 重量级锁


    适用场景

    追求吞吐量;同步代码块执行时间较长

     

    概念

    当轻量级锁膨胀到重量级锁之后,意味着线程只能被挂起阻塞来等待唤醒了。每个对象中都有一个Monitor监视器,而Monitor依赖操作系统的MuteLock(互斥锁)来实现,线程被阻塞后便进入内核(Linux)调度状态,这个会导致系统在用户态和内核态来回切换,严重影响锁的性能。

    monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,JVM要保证每个monitorenter必须有对应的monitorexit与之配对。而且当一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。可以简单理解为,在加重量级锁的时候会执行monitorenter指令,解锁时会执行monitorexit指令。

     

    三种锁的优缺点对比

    优点缺点适用场景
    偏向锁 加锁和解锁不需要额外的消耗,和执行非同步代码块仅存在纳秒级差距 如果线程间存在锁竞争,会带来额外的锁撤销消耗 适用于只有一个线程访问同步代码块场景
    轻量级锁 竞争的线程不会阻塞,提高了程序的响应速度 如果始终得不到锁,使用自旋会消耗CPU 追求响应时间;同步代码块执行时间非常短
    重量级锁 线程竞争不使用自旋,不会消耗CPU 线程阻塞,响应时间缓慢 追求吞吐量;同步代码块执行时间较长
  • 相关阅读:
    4 linux上运行crm&uwsgi
    Vue 目录
    vue -(滚动播放-全屏展示)
    Chrome 调试技巧
    Vue 遇到的坑
    9 matplotlib
    Maven
    Dev-C++黑暗主体和代码高亮配置
    Git操作:一次push把代码提交到两个仓库
    windows server 2012 r2 快速启动 部署remoteapp 显示服务器有挂起的重启,怎么解决?
  • 原文地址:https://www.cnblogs.com/lch-Hao/p/14490692.html
Copyright © 2020-2023  润新知