在併發開發中,鎖也是經常使用的乙個工具,主要是用於對共享資源的控制,常用的鎖就是lock
和synchronized
,這兩個鎖都可以達到執行緒安全的目的,但是在使用上有較大差別.
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()
synchronized
和lock
都可以保證可見性,就是說,當前執行緒獲取到鎖之後,可以看到上乙個執行緒做的所有操作
原理解析
對鎖做乙個簡單的介紹,以及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 ...