Lock和Condition(可重入鎖)

Lock有別於synchronized隱式鎖的三個特徵:可以響應中斷。支持超時和非阻塞地獲取鎖,也就是說lock比synchronized的功能豐富。java

JavaSDK併發包經過Lock和Condition兩個接 口來實現管程,其中Lock用於解決互斥問題,Condition用於解決同步問題 。安全

Lock接口的三個方法:併發

//	⽀持中斷的API 
void	lockInterruptibly() throws	InterruptedException; 
//	⽀持超時的API
boolean	tryLock(long time, TimeUnit	unit) throws	InterruptedException; 
//	⽀持⾮阻塞獲取鎖的API 
boolean	tryLock();

如何保證可見性

class X	{	
    private final Lock	rtl	= 	new	ReentrantLock();		
    int	value;		
    public	void	addOne()	{				
        //	獲取鎖				
        rtl.lock();						
        try	{						
            value+=1;				
        } finally {						
            //	保證鎖能釋放						
            rtl.unlock();				
        }		
    } 
}

什麼是可重入鎖(ReentrantLock)

指線程能夠重複獲取同一把鎖 。異步

//⽆參構造函數:默認⾮公平鎖 
public	ReentrantLock()	{				
    sync	=	new	NonfairSync(); 
} 
//根據公平策略參數建立鎖 fair=true是公平鎖
public	ReentrantLock(boolean fair){				
    sync = fair ? new FairSync() : new NonfairSync(); 
}

非公平可重入鎖示例:

線程能夠重複獲取同一把鎖。函數

/**
     * 當線程t執行到①處時,已經獲取到了鎖rtl,
     * 當在①處調用get()方法時,會在②再次對鎖rtl執行加鎖操做。
     * 此時,若是鎖	rtl	是可重入的,那麼線程T1能夠再次加鎖成功;若是鎖	rtl	是不可重入`	   * 的,那麼線程t此時會被阻塞。
     */
public class ReentrantLockExample {
    private final Lock rtl = new ReentrantLock();
    int value;

    public int get() {
        //	獲取鎖
        rtl.lock(); //②
        try {
            return value;
        } finally {
            //	保證鎖能釋放
            rtl.unlock();
        }
    }

    public void addOne() {
        //	獲取鎖
        rtl.lock();
        try {
            value = 1 + get();    //①
        } finally {
            //	保證鎖能釋放
            rtl.unlock();
        }
    }

可重入函數: 多個線程能夠同時調用該函數。線程

可重入函數是線程安全的。code

非公平鎖與公平鎖

ReentrantLock這個類有兩個構造函數,一個是無參構造函數,一個是傳入fair參數的構造函數。fair參數表明的是鎖的公平策略,若是傳入true就表示須要構造一個公平鎖,反 之則表示要構造一個非公平鎖。對象

//建立ReentrantLock時傳入true是公平鎖
private final Lock rtl = new ReentrantLock(true);
 //false或者不傳值是非公平鎖
private final Lock rtl = new ReentrantLock();

用鎖的最佳實踐

  1. 永遠只再更新對象的成員變量時加鎖。
  2. 永遠只在訪問可變的成員變量時加鎖。
  3. 永遠再也不調用其它對象的方法時加鎖。
  4. 減小所得持有時間,減少鎖的粒度。

同步與異步

  • 調用方法若是須要等待結果,就是同步;若是不須要等待結果就是異步。
  • 同步是Java代碼默認的處理方式。

如何實現程序支持異步:接口

  1. 異步調用: 調用方建立一個子線程,再子線程中執行方法調用。
  2. 異步方法: 被調用方;方法實現的時候,建立一個顯得線程執行主要邏輯,主線程直接return。

**** 碼字不易若是對你有幫助請給個關注****get

**** 愛技術愛生活 QQ羣: 894109590****

相關文章
相關標籤/搜索