方法鎖主要包括:synchronized鎖和lock鎖
區別:
1)Lock是一個接口,而synchronized是Java中的關鍵字;
2)synchronized當一個線程獲取了對應的鎖,並執行該代碼塊時,其他線程便只能一直等待,等待獲取鎖的線程釋放鎖,不能夠響應中斷,(釋放:1執行完線程自動釋放2發生異常jvm讓線程釋放)((比如調用sleep方法)),這樣的好處是不會導致死鎖現象發生。
Lock鎖,可以不讓等待的線程一直無期限地等待下去,比如只等待一定的時間或者響應中斷。
但Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時必須在try{}catch{}塊中進行,需要在finally塊中釋放鎖;
3)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。
在性能上來說,如果競爭資源不激烈,兩者的性能是差不多的,而當競爭資源非常激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優於synchronized。所以說,在具體使用時要根據適當情況選擇。
在併發量比較小的情況下,使用synchronized是個不錯的選擇,但是在併發量比較高的情況下,其性能下降很嚴重,此時ReentrantLock(可重入鎖,唯一實現了Lock接口的類)是個不錯的方案。