1. 程式人生 > >關於Java中鎖的幾點思考

關於Java中鎖的幾點思考

當對共享資源進行訪問的時候必須使用鎖對資源進行獨佔式宣告,保證同一時間只有一個執行緒對共享資源進行訪問。而一個執行緒可以多次訪問加鎖的共享資源,因為一個執行緒對共享資源的訪問都是順序的,不可能發生併發訪問共享資源導致的問題。所以,所有的鎖對於一個執行緒來說都是可重入的,只要當前執行緒獲取到了鎖。為此,Java中專門定義了一個類ReentrantLock來實現對資源的加鎖和釋放鎖的操作。它比Java中的Synchronized關鍵字提供了更加靈活的對鎖的操作,也比Synchronized關鍵字提供了更加明確的鎖的概念。
關於Synchronized關鍵字的可重入性和可重入鎖的介紹見博文:

Java多執行緒:synchronized的可重入性
Java不可重入鎖和可重入鎖理解
併發(一):理解可重入鎖
java多執行緒系列(四)—ReentrantLock的使用
自旋鎖、阻塞鎖、可重入鎖、悲觀鎖、樂觀鎖、讀寫鎖、偏向所、輕量級鎖、重量級鎖、鎖膨脹、物件鎖和類鎖
synchronized和鎖(ReentrantLock) 區別
java的兩種同步方式, Synchronized與ReentrantLock的區別
Java面試題:詳細說明一下可重入鎖ReentrantLock的原理
關於synchronized和ReentrantLock之多執行緒同步詳解
Java AQS學習-ReentrantLock原始碼分析

PS. 在實際的開發當中,我們更傾向於明確的宣告鎖:

Lock lock = new ReentrantLock(); // 普通鎖 或
ReadWriteLock rwLock = new ReentrantReadWriteLock(); // 讀寫鎖

JDK中關於鎖的宣告位於java.util.concurrent.locks包下面:
Java當中的鎖
最後在附上一篇非常好的博文:
一份針對於新手的多執行緒實踐