可重入锁 ReentrantLockITeye - AG环亚娱乐集团

可重入锁 ReentrantLockITeye

2019年03月13日11时41分42秒 | 作者: 昊磊 | 标签: 重入,线程,取得 | 浏览: 1291

引荐 : ReentrantLock与synchronized

1. 什么是可重入锁?

   - “就是能够从头取得锁!”可重入的意思是线程能够重复取得它现已持有的锁。Java的synchronized块是可重入的。

  看下面代码 :

public class Reentrant{
 public synchronized outer(){
 inner();
 public synchronized inner(){
 //do something
}

 2. ReentrantLock and synchronized的不同:

     - ReentrantLock 有必要显现的加锁lock(),最终有必要记住unlock() 而 synchronize是内置锁,不需要显现的开释锁

     - ReetrantLock 能够呼应中止,能够确保在线程还未取得而且企图取得锁时假如发现线程中止,则抛出反常铲除中止符号退出竞赛。经过“lockInterruptibly()”    

     - 而synchronize不会呼应中止!多线程竞赛一个锁时,其他未得到锁的线程只能不断的测验取得锁,而不能中止。即便你调用了interrupt也是没用的!

     - 公平性,ReentrantLock 的结构办法能够设置一个boolean fair ,取得锁的次序是不是和请求锁的时刻的次序是共同的 ,不允许插队,默许不公平的!

  

 

4. lock办法

  

/**public void lock() 
获取锁。 
假如该锁没有被另一个线程坚持,则获取该锁并当即回来,将锁的坚持计数设置为 1。 
假如当时线程现已坚持该锁,则将坚持计数加 1(state),而且该办法当即回来。 
假如该锁被另一个线程坚持,则出于线程调度的意图,禁用当时线程,而且在取得锁之前,该线程将一向处于休眠状况,此刻锁坚持计数被设置为 1。 
*/ 

 5. 可重入显现锁的简略完成

   

public class Lock{
 boolean isLocked = false;
 Thread lockedBy = null;
 int lockedCount = 0;
 public synchronized void lock()
 throws InterruptedException{
 Thread callingThread =
 Thread.currentThread();
 while(isLocked lockedBy != callingThread){
 wait();
 isLocked = true;
 lockedCount++;
 lockedBy = callingThread;
 public synchronized void unlock(){
 if(Thread.curentThread() 
 this.lockedBy){
 lockedCount;
 if(lockedCount  0){
 isLocked = false;
 notify();
}

 6. 原理剖析 :

    ReentrantLock的完成依赖于java同步器结构AbstractQueuedSynchronizer(本文简称之为AQS)。AQS运用一个整型的volatile变量(命名为state)来保护同步状况,立刻咱们会看到,这个volatile变量是ReentrantLock内存语义完成的要害。 下面是ReentrantLock的类图(仅画出与本文相关的部分):

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章