天天看點

ReentrantLock重入鎖以及實作原理

文章目錄

  • ​​lock:鎖​​
  • ​​lock概述​​
  • ​​lock的實作類​​
  • ​​ReentrantLock:重入鎖​​
  • ​​FairSync與NonFairSync 公平鎖與非公平鎖的差別​​

lock:鎖

lock概述

1.我們這裡的lock類隻是一個接口,具體的實作需要不同的lock類型去實作;      
package java.util.concurrent.locks;
import java.util.concurrent.TimeUnit;


public interface Lock {
    //鎖定線程
    void lock();
    void lockInterruptibly() throws InterruptedException;
    //tryLock是在不阻塞線程的基礎上,嘗試擷取鎖
    boolean tryLock();
    //也可以設定擷取鎖的逾時時間 tryLock(long time, TimeUnit unit)
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    //釋放鎖定的線程,一般與lock方法一起使用
    void unlock();
    Condition newCondition();
}      

lock的實作類

ReentrantLock重入鎖以及實作原理
ReentrantLock  重入鎖, 本章詳述
ReentrantReadWriteLock 重入讀寫鎖  後面會詳述
StampedLock 中的WriteLockView      

ReentrantLock:重入鎖

FairSync與NonFairSync 公平鎖與非公平鎖的差別

1.FairSync與NonFairSync的主要差別: 如果目前線程不是鎖的占有者,是否先加入到等待隊列的隊尾
  FairSync:公平鎖的話,就先加入到等待隊列的隊尾,
  NonFairSync:非公平鎖的話,就是不加如隊列,直接進行擷取鎖      
public ReentrantLock() {
        sync = new NonfairSync();
    }
    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }