Lock有別於synchronized隱式鎖的三個特徵:可以響應中斷。支持超時和非阻塞地獲取鎖,也就是說lock比synchronized的功能豐富。java
JavaSDK併發包經過Lock和Condition兩個接 口來實現管程,其中Lock用於解決互斥問題,Condition用於解決同步問題 。安全
Lock接口的三個方法:併發
// ⽀持中斷的API void lockInterruptibly() throws InterruptedException; // ⽀持超時的API boolean tryLock(long time, TimeUnit unit) throws InterruptedException; // ⽀持⾮阻塞獲取鎖的API boolean tryLock();
class X { private final Lock rtl = new ReentrantLock(); int value; public void addOne() { // 獲取鎖 rtl.lock(); try { value+=1; } finally { // 保證鎖能釋放 rtl.unlock(); } } }
指線程能夠重複獲取同一把鎖 。異步
//⽆參構造函數:默認⾮公平鎖 public ReentrantLock() { sync = new NonfairSync(); } //根據公平策略參數建立鎖 fair=true是公平鎖 public ReentrantLock(boolean fair){ sync = fair ? new FairSync() : new NonfairSync(); }
線程能夠重複獲取同一把鎖。函數
/** * 當線程t執行到①處時,已經獲取到了鎖rtl, * 當在①處調用get()方法時,會在②再次對鎖rtl執行加鎖操做。 * 此時,若是鎖 rtl 是可重入的,那麼線程T1能夠再次加鎖成功;若是鎖 rtl 是不可重入` * 的,那麼線程t此時會被阻塞。 */ public class ReentrantLockExample { private final Lock rtl = new ReentrantLock(); int value; public int get() { // 獲取鎖 rtl.lock(); //② try { return value; } finally { // 保證鎖能釋放 rtl.unlock(); } } public void addOne() { // 獲取鎖 rtl.lock(); try { value = 1 + get(); //① } finally { // 保證鎖能釋放 rtl.unlock(); } }
可重入函數: 多個線程能夠同時調用該函數。線程
可重入函數是線程安全的。code
ReentrantLock這個類有兩個構造函數,一個是無參構造函數,一個是傳入fair參數的構造函數。fair參數表明的是鎖的公平策略,若是傳入true就表示須要構造一個公平鎖,反 之則表示要構造一個非公平鎖。對象
//建立ReentrantLock時傳入true是公平鎖 private final Lock rtl = new ReentrantLock(true); //false或者不傳值是非公平鎖 private final Lock rtl = new ReentrantLock();
如何實現程序支持異步:接口
**** 碼字不易若是對你有幫助請給個關注****get
**** 愛技術愛生活 QQ羣: 894109590****