java中的lock和synchronized區別

2021-09-01 18:15:23 字數 845 閱讀 1880

1、reentrantlock 擁有synchronized相同的併發性和記憶體語義,此外還多了 鎖投票,定時鎖等候和中斷鎖等候

執行緒a和b都要獲取物件o的鎖定,假設a獲取了物件o鎖,b將等待a釋放對o的鎖定,

如果使用 synchronized ,如果a不釋放,b將一直等下去,不能被中斷

如果 使用reentrantlock,如果a不釋放,可以使b在等待了足夠長的時間以後,中斷等待,而幹別的事情

reentrantlock獲取鎖定與三種方式:

a) lock(), 如果獲取了鎖立即返回,如果別的執行緒持有鎖,當前執行緒則一直處於休眠狀態,直到獲取鎖

b) trylock(), 如果獲取了鎖立即返回true,如果別的執行緒正持有鎖,立即返回false;

c)trylock(long timeout,timeunit unit), 如果獲取了鎖定立即返回true,如果別的執行緒正持有鎖,會等待引數給定的時間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false;

d) lockinterruptibly:如果獲取了鎖定立即返回,如果沒有獲取鎖定,當前執行緒處於休眠狀態,直到或者鎖定,或者當前執行緒被別的執行緒中斷

2、synchronized是在jvm層面上實現的,不但可以通過一些監控工具監控synchronized的鎖定,而且在**執行時出現異常,jvm會自動釋放鎖定,但是使用lock則不行,lock是通過**實現的,要保證鎖定一定會被釋放,就必須將unlock()放到finally{}中

3、在資源競爭不是很激烈的情況下,synchronized的效能要優於reetrantlock,但是在資源競爭很激烈的情況下,synchronized的效能會下降幾十倍,但是reetrantlock的效能能維持常態;

linux中sync和direct的區別

學習如逆水行舟,不進則退 對於linux中一些常用的寫操作,對比一下direct和sync的區別,後面會專門起個專題講一下linux中的快取機制和page cache linux中sync和direct區別 o direct 繞過緩衝區快取記憶體,直接io 直接io linux允許應用程式在執行磁碟...

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...