1. 程式人生 > >簡單分析Synchronized(同步鎖)、Lock

簡單分析Synchronized(同步鎖)、Lock

Synchronized(同步鎖)

在Java中使用多執行緒,同步鎖這個概念是十分重要的。

平時的開發過程中,你必然會遇到一個問題:多個執行緒共享一個或者一組資源,這資源包括記憶體、檔案等,在多個執行緒對這組資源進行讀寫操作時,如何保持資料的準確性同步一致,這是至關重要的。

很常見的一個例子是,張三在銀行賬戶存有1000元,李四和張三同時對這個賬號在不同取款機多次的存取100,在這之後賬戶還有多少錢?

Lock(鎖)

Lock對比synchronized總結有以下差異

  1)Lock是一個介面,而synchronized是Java中的關鍵字,synchronized是內建的語言實現;

  2)synchronized在發生異常時,會自動釋放執行緒佔有的鎖,因此不會導致死鎖現象發生;而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;

  3)Lock可以讓等待鎖的執行緒響應中斷,而synchronized卻不行,使用synchronized時,等待的執行緒會一直等待下去,不能夠響應中斷;

  4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。

  5)Lock可以提高多個執行緒進行讀操作的效率。

  在效能上來說,如果競爭資源不激烈,兩者的效能是差不多的,而當競爭資源非常激烈時(即有大量執行緒同時競爭),此時Lock的效能要遠遠優於synchronized。所以說,在具體使用時要根據適當情況選擇。

Lock的操作與synchronized相比,靈活性更有Lo高,而且Lock提供多種方式獲取鎖,ck、ReadWriteLock介面,以及實現這兩個介面的ReentrantLock類、ReentrantReadWriteLock類。