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