首頁 >Java >java教程 >java並發程式設計之顯式鎖定詳解

java並發程式設計之顯式鎖定詳解

零下一度
零下一度原創
2017-06-25 10:26:451532瀏覽

明確鎖定

 一、Lock與ReentrantLock

  Lock提供了一種無條件的、可輪詢的、定時的以及可中斷的鎖定獲取操作,所有的加鎖和解鎖方法都是顯式的

  ReentrantLock實現了Lock:並提供了和synchronized相同的記憶體語義;同時提供了可重入的加鎖語義

#  1.基本語意:

void LockDefinition() {
        Lock lock = new ReentrantLock();try {//do someting//更新对象状态,捕获异常;并在必要时恢复不变性条件} finally {//finally中释放锁            lock.unlock();
        }
    }

 

  2.輪詢鎖與定時鎖定

    lock.tryLock([Long,Time

    lock.tryLock([Long,TimeUnit]):嘗試取得鎖,帶上時間就是定時鎖定

  3.可中斷的鎖定獲取操作

    lock.lockInterruptibly();

#二、公平性

#  ReentrantLock可以創造公平鎖(已要求順序取得鎖)和非公平鎖(可插隊)。

    插隊:當一個執行緒請求非公平鎖,如果在發出請求的同時該鎖的狀態可用,那麼這個執行緒不會放入佇列,會跳過佇列中所有的等待執行緒並獲得鎖;

    注意:非公平鎖不提倡插隊,但無法防止插隊;而公平鎖則是會放入隊列中順序執行

    非公平鎖在競爭激烈時速度比公平鎖快:原因是在恢復一個在佇列中的執行緒與該執行緒開始運行之間存在嚴重的延遲

三、讀-寫鎖

  ReentrantLock是標準的互斥鎖,但是在某些場景如:讀讀可並行無法實現

  ReadWriteLock讀寫鎖定:實作ReentrantReadWriteLock:方法readLock讀鎖定和writeLock寫鎖定

  1、互動和實作方式

    釋放優先:當一個寫鎖被釋放,而佇列中​​同時存在讀和寫,那麼應該優先選擇讀,寫,還是最先發出請求的線程?

    讀線程插隊:當前讀鎖,有寫鎖在等待,那麼後面來的讀鎖要不要插隊直接讀?如果直接讀取會提高並發但是會可能造成寫入飢餓獲取不到

    重入性:讀取鎖定和寫入鎖定是否可重入?

    降級:寫鎖,能否在不釋放鎖情況下取得讀鎖,使該執行緒的鎖降級?

    升級:讀鎖能否優先於其他等待執行緒升級為寫入鎖定?如果兩個執行緒試圖同時升級為寫鎖,那麼容易造成死鎖

  適用於:讀取運算為主的資料結構

 ####

以上是java並發程式設計之顯式鎖定詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn