鎖定是用來控制多個執行緒存取共享資源的方式,一般來說,一個鎖定能夠防止多個執行緒同時存取共享資源。
Java中的鎖定主要有以下幾個概念:
1、同步鎖定
#同一時刻,一個同步鎖定只能被一個執行緒存取。以物件為依據,透過synchronized關鍵字來進行同步,實現對競爭資源的互斥存取。
2、獨佔鎖(可重入的互斥鎖)
互斥,即在同一時間點,只能被一個執行緒持有;可重入,即可以被單一線程多次獲取。什麼意思呢?根據鎖的取得機制,它分為「公平鎖」和「非公平鎖」。 Java中透過ReentrantLock實現獨佔鎖,預設為非公平鎖。
3、公平鎖
是依照透過CLH等待執行緒依照先來先得的規則,執行緒依序排隊,公平的取得鎖,是獨佔鎖的一種。 Java中,ReetrantLock中有一個Sync型別的成員變數sync,它的實例為FairSync型別的時候,ReetrantLock為公平鎖。設定sync為FairSync類型,只需—Lock lock = new ReetrantLock(true)。
4、非公平鎖
是當執行緒要取得鎖定時,它會無視CLH等待佇列而直接取得鎖定。 ReetrantLock預設為非公平鎖,或-Lock lock = new ReetrantLock(false)。
5、共享鎖定
能被多個執行緒同時取得、共享的鎖定。即多個執行緒都可以取得該鎖,對該鎖物件進行處理。典型的就是讀鎖——ReentrantReadWriteLock.ReadLock。即多個線程都可以讀它,而且不影響其他線程對它的讀,但是大家都不能修改它。 CyclicBarrier, CountDownLatch和Semaphore也都是共享鎖。
6、讀寫鎖
維護了一對相關的鎖,“讀取鎖”用於只讀操作,它是“共享鎖”,能同時被多個線程獲取。 “寫入鎖”用於寫入操作,它是“獨佔鎖”,只能由一個執行緒鎖取得。在
Java中,讀寫鎖為ReadWriteLock 介面定義,其實作類別為ReentrantReadWriteLock,包含內部類別ReadLock和WriteLock。方法readLock()、writeLock()分別回傳度操作的鎖和寫入操作的鎖。
更多java知識請關注java基礎教學。
以上是java中的鎖是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!