zoukankan      html  css  js  c++  java
  • 【JUC】无锁、偏向锁、轻量级锁、重量级锁

    1.对象的结构

     2.在mark word里面的 锁标志位

     3.synchronized底层实现

    synchronized经过javac编译之后,生成两个字节码 monitorenter moniterexit

    monitor是监视器(管程)的意思,监视器只允许1个线程进入。

    结合下图 线程A进入监视器 进行运行,期间需要等待别的数据(类似于生产者消费者模式,消费者没有东西消费了)

    这时候线程B进入监视器进行运行,当运行结束或期间 可以使用等待/通知机制(wait/notify机制)来唤醒线程A。线程B则exit 

     性能问题:monitorenter moniterexit的操作系统是使用mutexlock来实现的,

    Java线程是对操作系统线程的一个映射,所以每次线程的挂起和唤醒 需要切换内核态和用户态 。十分重量级的

    4。由于上面性能问题,Java6引入了

    无锁

    偏向锁

    轻量级锁

    重量级锁

    四种锁的状态。注意:锁只能升级不能降级

    5.无锁

    6.偏向锁

    对于某一线程(通过线程ID辨识)偏向。

     如果出了偏向的线程还有别的线程也在争取资源,则升级为轻量级锁。

    7.轻量级锁

    (1)线程检测到所标志位00 为轻量级锁。在线程的虚拟机栈开一个空间 叫lock record 

    (2)通过CAS 不断尝试获取对象。获取到后,在lock record里面保存mark word副本

    (3)还有一个指针,owner pointer指向对象。

    (4)在对象的对象头生成一个指针指向获取该对象的lock record

     

     其他的线程进行自旋 进行等待,如果超过1个 在自旋等待,则会升级为重量级锁。

    8.重量级锁就是我们开始说的synchronized锁。

  • 相关阅读:
    codeforces #595 div3 题解
    codeforces #593 div2 ABCD 题解
    codeforces #594 div2 ABCD1F
    codeforces gym102040 前四题签到题解
    struts2.5 使用i18n国际化时中文乱码的一种解决方案
    2019 南昌 ICPC网络赛 H The Nth Item (矩阵快速幂/二次剩余+记忆化)
    Cubes UVA10601 POLYA定理
    TODO-LIST
    线性基模板整理
    2019牛客多校训练第三场B.Crazy Binary String(思维+前缀和)
  • 原文地址:https://www.cnblogs.com/cckong/p/14476871.html
Copyright © 2011-2022 走看看