-
boolean tryLock(long time, TimeUnit unit)
Lock lock = new ReentrantLock();
lock.tryLock(5, TimeUnit.SECONDS); //在5秒之內嘗試獲得鎖巡球,超時后未獲得鎖返回false
public class T03_ReentrantLock3 {
Lock lock = new ReentrantLock();
void m1() {
try {
lock.lock();
for (int i = 0; i < 3; i++) {
TimeUnit.SECONDS.sleep(1);
System.out.println(i);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
/**
* 使用tryLock進行嘗試鎖定,不管鎖定與否骂铁,方法都將繼續(xù)執(zhí)行
* 可以根據tryLock的返回值來判定是否鎖定
* 也可以指定tryLock的時間假残,由于tryLock(time)拋出異常,所以要注意unclock的處理,必須放到finally中
*/
void m2() {
/*
boolean locked = lock.tryLock();
System.out.println("m2 ..." + locked);
if(locked) lock.unlock();
*/
boolean locked = false;
try {
locked = lock.tryLock(5, TimeUnit.SECONDS);
System.out.println("m2 ..." + locked);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(locked) lock.unlock();
}
}
public static void main(String[] args) {
T03_ReentrantLock3 rl = new T03_ReentrantLock3();
new Thread(rl::m1).start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(rl::m2).start();
}
}
上面m1()
結束后,m2()
會獲得鎖帆离,locked=true;
-
lockInterruptibly()
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Thread t1 = new Thread(()->{
try {
lock.lock();
System.out.println("t1 start");
TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
System.out.println("t1 end");
} catch (InterruptedException e) {
System.out.println("interrupted!");
} finally {
lock.unlock();
}
});
t1.start();
Thread t2 = new Thread(()->{
try {
//lock.lock();
lock.lockInterruptibly(); //可以對interrupt()方法做出響應
System.out.println("t2 start");
TimeUnit.SECONDS.sleep(5);
System.out.println("t2 end");
} catch (InterruptedException e) {
System.out.println("interrupted!");
} finally {
lock.unlock();
}
});
t2.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.interrupt(); //打斷線程2的等待
}
運行輸出:
t1 start
interrupted!
上面t1會一直運行蔬蕊,t2獲取不到鎖,t2.interrupt()之后,t2被打斷岸夯,拋出異常
-
ReentrantLock lock=new ReentrantLock(true);
- reentrantLock默認是非公平鎖麻献,可以設置為公平鎖,公平鎖的話猜扮,內部會有一個隊列勉吻,若果鎖被他人占有,其他要獲的鎖的線程會依次入隊列旅赢,每次獲得鎖的時候要去判斷隊列是否為空齿桃,為空直接獲得鎖。而非公平鎖直接去搶占鎖煮盼。
-
與synchronized的區(qū)別
- synchronized系統(tǒng)自動加鎖短纵,自動解鎖,ReentrantLock需要手動控制僵控。
- ReentrantLock可以有不同的condition香到,不同的等待隊列,synchronized沒有
- synchronized有鎖的四種狀態(tài)的升級报破,ReentrantLock用的CAS的實現悠就。