Lock接口
鎖是用來控制多個線程通路共享資源的方式
一般來說,鎖能夠防止多個線程同時通路共享資源(但也有的鎖可以允許多個線程通路共享資源,比如讀寫鎖)
在Lock接口出現前,靠synchronized實作鎖功能,但是在Java5之後并發包中新增了Lock接口(及其相關實作類)來實作鎖功能.
它提供了與synchronized類似的同步功能,隻是Lock需要顯示的擷取和釋放鎖,雖然缺少了隐式擷取釋放鎖的便捷性,但是擁有了擷取與釋放鎖的可操作性,可中斷的擷取鎖以及逾時擷取等多種synchronized不具備的同步特性
大體上使用synchronized代碼量更少,出錯可能性低,是以通常隻有在處理特殊問題時,才使用顯式的Lock對象.
使用也很簡單,如下
Lock lock = new ReentrantLock();
lock.lock();
try {
} finally {
lock.unlock();
}
在finally塊中釋放鎖,是為保證在擷取到鎖之後,最終能夠被釋放。這也是比synchronized好的地方,即使某些事務失敗了,finally字句的unlock()将系統維護在正确狀态
不要将擷取鎖的過程寫在try塊中,因為如果在擷取鎖(自定義鎖的實作)時發生了異常,異常抛出的同時,也會導緻鎖無故釋放。
Lock接口提供的synchronized所不具備的主要特性如下表

Lock是一個接口,它定義了鎖擷取和釋放的基本操作,API如表
這裡隻是簡單介紹一下Lock接口的API
Lock接口的實作基本都是通過聚合了一個同步器的子類來完成線程通路控制的