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 之外的型...