lock與synchronized的區別
1. Lock是一個介面,而synchronized是Java中的關鍵字,synchronized是內建的語言實現,synchronized是在JVM層面上實現的,不但可以通過一些監控工具監控synchronized的鎖定,而且在程式碼執行時出現異常,JVM會自動釋放鎖定。
但是使用Lock則不行,lock是通過程式碼實現的,要保證鎖定一定會被釋放,就必須將 unLock()放到finally{} 中;
2. synchronized在發生異常時,會自動釋放執行緒佔有的鎖,因此不會導致死鎖現象發生;
而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;
3. Lock可以讓等待鎖的執行緒響應中斷,執行緒可以中斷去幹別的事務,而synchronized卻不行,使用synchronized時,等待的執行緒會一直等待下去,不能夠響應中斷
4. 通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。
5. Lock可以提高多個執行緒進行讀操作的效率。
在效能上來說,如果競爭資源不激烈,兩者的效能是差不多的,而當競爭資源非常激烈時(即有大量執行緒同時競爭),此時Lock的效能要遠遠優於synchronized。所以說,在具體使用時要根據適當情況選擇。
舉個例子:當有多個執行緒讀寫檔案時,讀操作和寫操作會發生衝突現象,寫操作和寫操作會發生衝突現象,但是讀操作和讀操作不會發生衝突現象。
但是採用synchronized關鍵字來實現同步的話,就會導致一個問題:
如果多個執行緒都只是進行讀操作,所以當一個執行緒在進行讀操作時,其他執行緒只能等待無法進行讀操作。
因此就需要一種機制來使得多個執行緒都只是進行讀操作時,執行緒之間不會發生衝突,通過Lock就可以辦到。
另外,通過Lock可以知道執行緒有沒有成功獲取到鎖。這個是synchronized無法辦