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

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 深度写了一下后续过程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作者: 一字马胡 转载标志 【2017-11-03】 更新日志 前言 在java中,锁是实现并发的关键组件,多个...
    一字马胡阅读 44,200评论 1 32
  • 前言 上一篇文章《基于CAS操作的Java非阻塞同步机制》 分析了非同步阻塞机制的实现原理,本篇将分析一种以非同步...
    Mars_M阅读 4,848评论 5 9
  • 一、多线程 说明下线程的状态 java中的线程一共有 5 种状态。 NEW:这种情况指的是,通过 New 关键字创...
    Java旅行者阅读 4,754评论 0 44
  • 1.解决信号量丢失和假唤醒 public class MyWaitNotify3{ MonitorObject m...
    Q罗阅读 922评论 0 1
  • 一醉在于三两杯,万千心事半成灰。 梦催岁数同年去,霜染交朋两鬓来。 当日人前夸海口,现场雪后绝纤埃。 朔风虽未化春...
    雪窗_武立之阅读 334评论 2 4