zoukankan      html  css  js  c++  java
  • java -- 轻量级锁

    在了解轻量级锁之前,首先要知道什么是CAS

    CAS--Compare And Swap 比较并交换--通过比较传入的旧值和原内存位置中的值比较,来决定是不是要更新数据。

      CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”CAS是项 乐观锁 技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

      CAS指令需要三个操作数,分别为内存位置(在java中可以理解为变量在内存中的位置,用V标识)、旧的预期值(用A标识)、新值(用B 标识)。当CAS指令执行的时候,当且仅当V符合预期值A,处理器才会使用新值B更新V,否则他就不执行更新,但是是否更新了V,都会返回V的旧值,而且这一系列的操作过程都是原子性的。

    1 int compare_and_swap (int* reg, int oldval, int newval) 
    2 {
    3   ATOMIC();
    4   int old_reg_val = *reg;
    5   if (old_reg_val == oldval) 
    6      *reg = newval;
    7   END_ATOMIC();
    8   return old_reg_val;
    9 }

    具体详细介绍可以参见:http://www.tuicool.com/articles/zuui6z

    其中百度百科上面说的也可以理解其原理:

      compare and swap,解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置 的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS 有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。

      另外要理解轻量级锁,还需要知道MarkWord ---

    这其中lock record 称之为锁记录的空间,如果上面图中ptr to lock record 的标志位为01,表示该对象没有锁定,那么虚拟机首先将在当前线程帧栈中建立一个lock record 的空间,用于存储当前对象的markword 的一份拷贝;然后使用CAS操作尝试将mark-word更新为指向lock record的指针,如果更新成功那么就说明该线程已经拥有了该对象的使用权限,那么就会将上面ptr to  lock record  的标志位设置为00证明该对象正在处于轻量级锁定状态。

      当线程使用该对象的时候,首先要检查该标志位是不是处于轻量级锁定状态,如果是证明有线程正在使用该对象。

      同样在解锁的过程中,使用的正是CAS方式,他会尝试将原来在lock record 的mard word 和 对象 头部的mark word 替换回来。如果替换成功表示,众线程已经完成了同步操作,如果没有的话,表示还有其他线程尝试过获取该锁,那么就要唤醒被挂起的线程。

  • 相关阅读:
    银行家算法实例(转)
    DNS中的七大资源记录介绍!(转)
    android之存储篇_SQLite数据库_让你彻底学会SQLite的使用(转)
    回顾HTML5的语义化元素
    vueJs2.0学习笔记(六)
    vueJs2.0学习笔记(五)
    vueJs的学习笔记(四)
    vueJs2.0学习笔记(三)
    vueJs的学习笔记(二)
    vueJs 2.0学习笔记(一)
  • 原文地址:https://www.cnblogs.com/plxx/p/4539918.html
Copyright © 2011-2022 走看看