日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

locklock locklock


locklock locklock


推薦學(xué)習(xí)全網(wǎng)首發(fā)!馬士兵內(nèi)部共享—1658頁(yè)《Java面試突擊核心講》狂刷《Java權(quán)威面試指南(阿里版)》,沖擊“金九銀十”有望了
在 Java 中有兩種鎖,一種是內(nèi)置鎖 synchronized,一種是顯示鎖 Lock,其中 Lock 鎖是可中斷鎖,而 synchronized 則為不可中斷鎖 。
所謂的中斷鎖指的是鎖在執(zhí)行時(shí)可被中斷,也就是在執(zhí)行時(shí)可以接收 interrupt 的通知,從而中斷鎖執(zhí)行 。?
PS:默認(rèn)情況下 Lock 也是不可中斷鎖,但是可以通過(guò)特殊的“手段”,可以讓其變?yōu)榭芍袛噫i,接下來(lái)我們一起來(lái)看 。
為什么需要可中斷鎖?
不可中斷鎖的問(wèn)題是,當(dāng)出現(xiàn)“異?!睍r(shí),只能一直阻塞等待,別無(wú)其他辦法,比如下面這個(gè)程序 。下面的這個(gè)程序中有兩個(gè)線程,其中線程 1 先獲取到鎖資源執(zhí)行相應(yīng)代碼,而線程 2 在 0.5s 之后開(kāi)始嘗試獲取鎖資源,但線程 1 執(zhí)行時(shí)忘記釋放鎖了,這就造成線程 2 一直阻塞等待的情況,實(shí)現(xiàn)代碼如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class InterruptiblyExample {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
// 創(chuàng)建線程 1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
System.out.println("線程 1:獲取到鎖.");
// 線程 1 未釋放鎖
}
});
t1.start();
// 創(chuàng)建線程 2
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// 先休眠 0.5s,讓線程 1 先執(zhí)行
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 獲取鎖
System.out.println("線程 2:等待獲取鎖.");
lock.lock();
try {
System.out.println("線程 2:獲取鎖成功.");
} finally {
lock.unlock();
}
}
});
t2.start();
}
}
以上代碼執(zhí)行的結(jié)果如下:
從上述結(jié)果可以看出,此時(shí)線程 2 在等待獲取鎖的操作,然而經(jīng)歷了 N 久之后…
再次查看結(jié)果,依然是熟悉的畫面:
線程 2 還在阻塞等待獲取線程 1 釋放鎖資源,此時(shí)的線程 2 除了等之外,并無(wú)其他方法 。?
并且,當(dāng)我們熟練地拿出了 JConsole,試圖得到一個(gè)死鎖的具體信息時(shí),卻得到了這樣的結(jié)果:
并沒(méi)有檢測(cè)到任何死鎖信息,從上圖我們可以看出,當(dāng)只有一個(gè)鎖資源的時(shí)候,系統(tǒng)并不會(huì)把這種情況判定為死鎖,當(dāng)然也沒(méi)有阻塞等待的具體信息嘍,此時(shí)只剩下線程 2 孤單地等待著它的“鎖兒” 。
使用中斷鎖
然而,中斷鎖的出現(xiàn),就可以打破這一僵局,它可以在等待一定時(shí)間之后,主動(dòng)的中斷線程 2,以解決線程阻塞等待的問(wèn)題 。?
中斷鎖的核心實(shí)現(xiàn)代碼是 lock.lockInterruptibly() 方法,它和 lock.lock() 方法作用類似,只不過(guò)使用 lockInterruptibly 方法可以優(yōu)先接收中斷的請(qǐng)求,中斷鎖的具體實(shí)現(xiàn)如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class InterruptiblyExample {
public static void main(String[] args) throws InterruptedException {
Lock lock = new ReentrantLock();
// 創(chuàng)建線程 1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
// 加鎖操作
lock.lock();
System.out.println("線程 1:獲取到鎖.");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 線程 1 未釋放鎖
}
});
t1.start();

推薦閱讀