實現reentrantlock和讀寫鎖

2022-08-28 22:06:30 字數 978 閱讀 2020

1 可以手動實現乙個類似reentrantlock的工具,首先要維護乙個state的標誌,代表當前是否有執行緒已經使用資源。執行緒lock的時候,
會用cas給state加1,其他執行緒檢測狀態。另外需要維護乙個等待佇列,爭奪不到資源的執行緒統一掛起(park),等執行緒unlock的時候,
標誌減為0,同時從佇列裡挑乙個執行緒unpark喚醒,繼續得到資源操作;如果想讓佇列執行緒競爭,就都喚醒,最終只有乙個得到資源。
這是實現了基本的鎖。
public class lklock  catch (exception e) 

}public void lock()else

}public void unlock()

}private void acquire(int i) catch (interruptedexception e)

}public int getstate()

private boolean compareandsetstate(int src, int target)

}

2  同樣 如果想要實現能夠重入的讀寫鎖,讀可重入,寫唯一,並且讀寫互斥,那麼需要用兩個資源分別給讀寫的執行緒競爭,

讀的資源可累加,每次執行緒readlock的時候加一,不設上限;寫的執行緒如上面只可唯一執行緒獲得資源。並且無論讀寫執行緒競爭資源之前,

都要檢測對方資源是否已經被占用,如果占用也要掛起,這樣可以達到互斥。改動如下 

public void readlock()

if(compareandsetreadstate(readstate,readstate+1))else

}public void readunlock()}}

public void writelock()

if(compareandsetwritestate(0,1))else

}public void writeunlock()

}}

ReentrantLock實現同步

reentrantlock 也可以實現synchronized方法 塊的同步效果。reentrantlock 實現同步 如下 1 新建乙個service類 public class myservice public static void methodb 2 新建乙個測試類 public class...

ReentrantLock實現原理分析

本文只對reentrantlock中獲取鎖和釋放鎖的方法進行分析,其它方法不做分析。final void lock protected final boolean tryacquire int acquires else if current getexclusiveownerthread retu...

ReentrantLock 以及 AQS 實現原理

reentrantlock是可重入鎖,什麼是可重入鎖呢?可重入鎖就是當前持有該鎖的執行緒能夠多次獲取該鎖,無需等待。可重入鎖是如何實現的呢?這要從reentrantlock的乙個內部類sync的父類說起,sync的父類是abstractqueuedsynchronizer 後面簡稱aqs aqs是j...