1. 程式人生 > >Java中的鎖之Lock介面

Java中的鎖之Lock介面

  從JDK5開始,併發程式設計大師Doug Lea加入了Lock介面,為Java語言中的併發處理加入了一股清流,先來認識一下這個介面:

  首先要知道鎖是來幹嘛的?鎖是用來控制多個執行緒訪問共享資源的方式,一般來說,一個鎖能夠防止多個執行緒同時訪問共享資源(但是有些鎖可以允許多個執行緒併發的訪問共享資源,比如讀寫鎖)。在Lock接口出現之前,Java程式是靠synchronized關鍵字實現鎖功能的,而Java SE 5之後,併發包中新增了Lock介面(以及相關實現類)用來實現鎖功能,它提供了與synchronized關鍵字類似的同步功能,只是在使用時需要顯式地獲取和釋放鎖。雖然它缺少了(通過synchronized塊或者方法所提供的)隱式獲取釋放鎖的便捷性,但是卻擁有了鎖獲取與釋放的可操作性、可中斷的獲取鎖以及超時獲取鎖等多種synchronized關鍵字所不具備的同步特性。

  使用synchronized關鍵字將會隱式地獲取鎖,但是它將鎖的獲取和釋放固化了,也就是先獲取再釋放。當然,這種方式簡化了同步的管理,可是擴充套件性沒有顯示的鎖獲取和釋放來的好,而使用Lock卻容易許多。Lock介面提供的synchronized關鍵字不具備的主要特性有三點:嘗試非阻塞地獲取鎖、能被中斷地獲取鎖和超時獲取鎖。對於以上原始碼中的API,做一下解釋:

void lock():獲取鎖,呼叫該方法當前執行緒將會獲取鎖,當鎖獲得後,從該方法返回。

void lockInterruptibly() throws InterruptedException:可中斷地獲取鎖,和lock()方法不同之處在於該方法會響應中斷,即在鎖的獲取中可以中斷當前執行緒。

boolean tryLock():嘗試非阻塞的獲取鎖,呼叫該方法後立即返回,如果能夠獲取則返回true,不能則返回false。

boolean tryLock(long time, TimeUnit unit) throws InterruptedException:超時的獲取鎖,當前執行緒會在下面情況下返回:當前執行緒在超時時間內獲取了鎖、當前執行緒在超時時間內被中斷、超時時間結束返回false。

void unlock():釋放鎖。

Condition newCondition():獲取等待通知元件,該元件和當前的鎖繫結,當前執行緒只有獲取了鎖,才能呼叫該元件的wait()方法,呼叫後,當前執行緒將釋放鎖。

Lock介面的實現基本都是通過聚合了一個同步器的子類來完成執行緒訪問控制的。我們常用的重入鎖ReentrantLock就是實現了Lock介面。