ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ReentrantLock锁源码分析:非公平锁

2021-10-01 15:34:43  阅读:168  来源: 互联网

标签:变量 ReentrantLock state 源码 volatile 公平 线程 内存


ReentrantLock是实现Lock接口的一种锁

定义了一个final类型的Sync

 

Sync使用AQS的state表示对锁的持有次数

分为公平锁和非公平锁

 

调用Lock方法

lock方法,分为公平锁和非公平锁两个版本

 

非公平锁

 

CAS操作

compareAndSetState(expect,update);

如果当前状态值等于预期值,则原子地将同步状态设置为给定的更新值。 此操作具有易失性读写的内存语义。

参数:期望 - 期望值,更新 - 新值

返回:如果成功则为真。 假返回表示实际值不等于预期值。

如果预期值位0那么设置为1

最终也是调用sun.misc.Unsafe相关的方法,这个方法的四个参数第一个表示操作的是那个对象,第二个表示操作对象字段的偏移量,第三个是期望值,第四个是更新值

 

volatile

state状态是用volatile来修饰的

如果不使用volatile的时候,如果两个线程thread1和thread2同时执行同一个方法来修改state为1,当thread把state从0变为1时,thread2没有感知还以为state还是0,这样也成功把0修改为1,这样两个线程都认为自己成功执行了获取锁的行为

 

volatile的功能:

a: 保证变量在线程之间的可见性 就是上面说的

b:禁止指令重排序 在编译阶段插入内存屏障,来特定禁止指令重排序

 

如果使用volatile,两个线程thread1和thread2,当thread1写会成功之后会让其它线程中该变量的副本失效,把成功后的值刷回主内存,并重新从主存load新的,这样一来thread2 expect=0,update=1就会失败,因为此时的expect=0是不成立的

 

JMM模型

工作内存:

每个线程都有自己的工作内存,里面保存了用到的变量和主内存的拷贝,叫做工作内存

线程对变量进行操作都在这个拷贝中操作,而不能直接读写主内存中的变量,每个线程的工作内存都是独立的,线程操作数据只能在工作内存(虚拟机栈)中进行,然后刷回到主存(堆加方法区)。这是 Java 内存模型定义的线程基本工作方式

 

当一个线程修改共享变量的值,其他线程能够立即知道被修改了,Java是利用volatile关键字来提供可见性的。当变量被volatile修饰时,这个变量被修改后会立刻刷新到主内存,当其它线程需要读取该变量时,会去主内存中读取新值。而普通变量则不能保证这一点

 

非公平锁的流程

因此在非公平锁中,AQS的volatile int state +1表示获取到了锁

通过cas设置AQS的成员status,大家注意到status是用volatile来修饰的,它在此处表示让所线程能够获取到最新更改的值

设置当前拥有独占访问权限的线程。

参数:Thread.curretThread()当前线程

线程 - 所有者线程

 

执行完lock方法后,调用tryAcquire方法

protected final boolean tryAcquire(int acquires) {
    return nonfairTryAcquire(acquires);
}

其中

获取当前线程,拿到当前锁状态

如果没加锁就加锁,如果加了锁,把当前锁状态state+1

若上述执行完成则代表成功,否则失败

标签:变量,ReentrantLock,state,源码,volatile,公平,线程,内存
来源: https://www.cnblogs.com/ak918xp/p/15359426.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有