JUC 3 0 鎖 Lock的基本使用

2021-10-05 05:07:02 字數 1718 閱讀 7550

在併發開發中,鎖也是經常使用的乙個工具,主要是用於對共享資源的控制,常用的鎖就是locksynchronized,這兩個鎖都可以達到執行緒安全的目的,但是在使用上有較大差別.

lock一般情況用於synchronized不滿足要求或者不合適的時候,lock是乙個介面,最常用的實現類就是reentrantlock,一般情況下lock只允許乙個執行緒訪問共享資源,但是也有特殊的鎖可以實現併發訪問,比如讀寫鎖(readwritelock)中的讀鎖(readlock) 。

synchronized 的劣勢

既然有了synchronized為什麼還需要lock?

相比於lock,synchronized有以下幾個不足之處:

鎖的釋放情況少,試圖獲得鎖時不能設定超時時間,而且不能中斷乙個正在獲得鎖的執行緒

不夠靈活,加鎖和釋放的時機單一,每個鎖僅有單一的條件(某個物件)在一些情況下是不夠的

無法知道是否成功獲取鎖

常用方法

lock中有以下4個獲取鎖的方法

lock(): 阻塞去獲取鎖,直到獲取成功(所以一旦出現死鎖的情況執行緒將永久阻塞),跟synchronized相比,lock不會再異常中釋放鎖,所以一定要在finally中釋放鎖

trylock(): 嘗試獲取鎖,不會阻塞,立即返回有沒有成功獲取到,獲取到的話返回 true ,否則返回 false

trylock(long time, timeunit unit): 加乙個等待時間,在等待時間內嘗試獲取鎖,超時就放棄,獲取到的話返回 true ,否則返回 false

lockinterruptibly(): 這個方法相當於把trylock(long time, timeunit unit)中的時間設定為無限,但是這個方法獲取鎖的過程中,執行緒可以中斷

lock() 與 lockinterruptibly()比較區別在於:

lock 優先考慮獲取鎖,待獲取鎖成功後,才響應中斷。

lockinterruptibly 優先考慮響應中斷,而不是響應鎖的普通獲取或重入獲取。

詳細區別:

reentrantlock.lockinterruptibly允許在等待時由其它執行緒呼叫等待執行緒的thread.interrupt方法來中斷等待執行緒的等待而直接返回,這時不用獲取鎖,而會丟擲乙個interruptedexception。 reentrantlock.lock方法不允許thread.interrupt中斷,即使檢測到thread.isinterrupted,一樣會繼續嘗試獲取鎖,失敗則繼續休眠。只是在最後獲取鎖成功後再把當前執行緒置為interrupted狀態,然後再中斷執行緒。

釋放鎖的方法為unlock()

synchronizedlock都可以保證可見性,就是說,當前執行緒獲取到鎖之後,可以看到上乙個執行緒做的所有操作

原理解析

對鎖做乙個簡單的介紹,以及lock的基本使用

JUC框架學習 lock鎖總結

locke 介面 支援予以不同 重入,公平等 的鎖規則 1.公平鎖 2.非公平鎖 3.可重入鎖 實現lock介面的鎖,其構造方法中有 boolean fair引數控制,當fair為 true時,是公平鎖,反之為非公平鎖。預設是非公平鎖。以reentrantlock為例原始碼如下 無參構造 creat...

鎖的認識lock

case 1 事務正在更新一張table,並且該事務並沒有處理結束。此時,使用select查詢出來的結果是?update之前的?之後的?始終沒有output,知道事務處理結束?1 始終處於被堵塞狀態 begin tran update student set name change where id...

Lock鎖與synchronized鎖的區別

1 synchronized鎖是可以幫助我們自動開鎖和關閉鎖 2 lock鎖,我們最常用的是reentrantlock重入鎖,需要我們手動的開鎖和手動關鎖 3 synchronized只能與wait notify 方法一起使用 4 reentrantlock只能與condition類中的await ...