美文网首页
ReentrantLock可重入锁 用法及实现原理

ReentrantLock可重入锁 用法及实现原理

作者: sunyuan1125 | 来源:发表于2017-05-09 22:43 被阅读310次

1、用法

锁住

lock.lock();

for(inti =0; i <5; i++) {

foo// do sth.

lock.unlock();

线程获得锁 直到unlock,持有了对象监视器 效果和synchronized相似 锁住了对象

2、实现原理

内存语义:

a)临界区互斥执行

b)线程释放锁时可以向获取同一个锁的线程发送消息

c)锁释放时,工作内存中的共享变量刷进主内存;获得锁时,线程的工作内存被无效,必须从主内存中读取共享变量

d)实现通过fariSync 与noFairSync 均继承sync 继承AQS,默认调用非公平锁(所谓公平锁指的是哪个线程先运行,那就可以先得到锁。非公平锁是不管线程是否是先运行,都是随机获得锁的。

AQS abstractQueuedSynchronizer

1、FIFO 队列,由多个node组成,state 表示同步状态,0表示未锁

非公平锁调用流程

1、线程A调取lock()时,此时无锁,线程得到锁,且state变为1

2、线程B想获取锁时,由于state是volatile的,所以state对线程B具有可见性,线程B拿到最新的state,再次判断一下能否持有锁(可能线程A同步代码执行得比较快,这会儿已经释放了锁),不可以就返回false。

注意一下第10~第16行,这段代码的作用是让某个线程可以多次调用同一个ReentrantLock,每调用一次给state+1,由于某个线程已经持有了锁,所以这里不会有竞争,因此不需要利用CAS设置state(相当于一个偏向锁)。从这段代码可以看到,nextc每次加1,当nextc<0的时候抛出error,那么同一个锁最多能重入Integer.MAX_VALUE次,也就是2147483647。可重入的意义在此

http://blog.csdn.net/pfnie/article/details/53191892 深度写了一下后续过程

相关文章

网友评论

      本文标题:ReentrantLock可重入锁 用法及实现原理

      本文链接:https://www.haomeiwen.com/subject/fyyvtxtx.html