java關於並發模型中的兩種鎖知識點詳解

1、悲觀鎖

悲觀鎖假設最壞的情況(如果果你不鎖門,那麼搗蛋鬼就會闖入並搞得一團糟),隻有在確保其他線程不受幹擾(獲得正確的鎖)的情況下才能執行。

一般實現如獨占鎖等。

安全性更高,但中低並發性效率更低。

2、樂觀鎖

樂觀鎖通過沖突檢查機制判斷更新過程中是否存在其他線程幹擾。如果存在,操作將失敗,重試(也可以不重試)。

CAS等常見實現。

一些樂觀鎖削弱瞭一致性,但在中低並發性下效率大大提高。

知識點擴展:

並行與分佈式編程

關註的是復雜軟件系統的構造,“復雜”是指多線程、分佈式與GUI程序

在鎖與同步這一節中,詳細介紹瞭如何設計線程安全的ADT

並發

在我們的並發介紹中,我們看到瞭兩種並發編程模型:共享內存和消息傳遞。

• 在共享內存模型中 :並發模塊通過在內存中讀取和寫入共享可變對象來進行交互。在單個Java進程中創建多個線程是我們共享內存並發的主要示例。

• 在消息傳遞模型中:並發模塊通過通信通道相互發送不可變消息進行交互。該通信通道可以通過網絡連接不同的計算機,如我們的一些初始示例:Web瀏覽,即時消息等。

對於鎖,這是Java語言提供的內嵌機制,每個Object都有相關聯的lock;

首先來瞭解一下java鎖的相關概念

Java的內置鎖:每個java對象都可以用做一個實現同步的鎖,這些鎖成為內置鎖。線程進入同步代碼塊或者代碼方法的時候會自動獲得該鎖,在退出同步代碼塊或者方法的時候則會釋放該鎖。獲得內置鎖的唯一途徑就是進入這個鎖的保護的同步代碼塊或者方法。

Java內置鎖是一個互斥鎖:就是最多一個程序能夠得到這個鎖。當多個線程想要對某個mutable類型的ADT操作時,就是修改它的值時,鎖能夠劫持這些線程的操作,阻塞他們,隻有之前的線程結束調用時,釋放這個鎖,後面的線程才能獲得該鎖,否則一直等待下去。

用法

同步和鎖:阻止瞭多線程在同一時間內對可變數據的共享操作,即程序員來負責多線程之間對mutable數據的共享操作,通過”同步”策略,避免多線程同時訪問數據,使用鎖機制,獲取對數據的獨傢mutation權,其他線程被阻塞,不得訪問,即不可修改。

Java同步鎖實現方法

synchronized 關鍵詞修飾

wait、notify、notifyAll的使用