Java並發編程的藝術-Java中的鎖__演算法

來源:互聯網
上載者:User

Java中可以通過實現Lock介面的方式來建立自訂的同步組件,同步的組件核心其實就是同步隊列(AbstractQueuedSynchronizer一般是通過一個內部類來實現它,然後實現他之中的幾個方法);

可以這樣理解鎖與同步隊列的關係:鎖時面對使用者的,定義了使用者與鎖之間的互動介面;而同步隊列AQS是面向鎖的,它簡化了鎖的實現方式,對使用者來說,AQS屏蔽了同步管理,線程的排隊,等待與喚醒等底層操作,鎖和同步器很好的隔離了使用者和實現這所關注的領域。

在AQS中有一個volatile的state欄位,用於描述鎖的狀態。AQS的核心就是主要通過getState()、setState(newState)、compareAndSetState(except,update)來操作state欄位,以實現他自己的功能的。

AQS中可以被重寫的方法

實現自訂同步群組件時,將會調用同步器提供的模板方法。在模板方法中再去調用我們在同步器中重寫的相關方法,所以說,同步群組件不是直接去調用我們自訂的方法。

在同步器中提供的模板方法:

同步器提供的模板方法基本上分為3類:獨佔式擷取與釋放同步狀態、共用式擷取與釋放 同步狀態和查詢同步隊列中的等待線程情況 。自訂同步群組件將使用同步器提供的模板方法來實現自己的同步語義。

綜上可以總結出一個基本規律:
同步群組件方法->AQS模板方法->AQS實現自訂方法(箭頭代表調用)

同步器實現分析:
同步器依賴內部的同步隊列(一個FIFO雙向隊列)來完成同步狀態的管理,當前線程擷取同步狀態失敗時,同步器會將當前線程以及等待狀態等資訊構造成為一個節點(Node)並將其加入同步隊列,同時會阻塞當前線程,當同步狀態釋放時,會把首節點中的線程喚醒,使其再次嘗試擷取同步狀態。同步隊列中的節點(Node)用來儲存擷取同步狀態失敗的線程引用、等待狀態以及前驅和後繼節點,節點的屬性類型與名稱以及描述。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.