java 死锁种类_用java写一个死锁
什么是死鎖?
多個(gè)線程同時(shí)被阻塞,它們中的一個(gè)或者全部都在等待某個(gè)資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止。
不適當(dāng)?shù)氖褂谩皊ynchronized”關(guān)鍵詞來管理線程對特定對象的訪問。
“synchronized”關(guān)鍵詞的作用是,確保在某個(gè)時(shí)刻只有一個(gè)線程被允許執(zhí)行特定的代碼塊,因此,被允許執(zhí)行的線程首先必須擁有對變量或?qū)ο蟮呐潘缘脑L問權(quán)。當(dāng)線程訪問對象時(shí),線程會(huì)給對象加鎖,而這個(gè)鎖導(dǎo)致其它也想訪問同一對象的線程被阻塞,直至第一個(gè)線程釋放它加在對象上的鎖。
packagecom.練習(xí)鎖;public classTest {static Object o1 = newObject();static Object o2 = newObject();public static voidmain(String[] args) {new Thread(newRunnable() {public voidrun() {synchronized(o1) {
System.out.println("線程1鎖o1");try{
Thread.sleep(1000);//讓當(dāng)前線程睡眠,保證讓另一線程得到o2,防止這個(gè)線程啟動(dòng)一下連續(xù)獲得o1和o2兩個(gè)對象的鎖。
synchronized(o2) {
System.out.println("線程1鎖o2");
}
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();new Thread(newRunnable() {public voidrun() {synchronized(o2) {
System.out.println("線程2鎖o2");synchronized(o1) {
System.out.println("線程2鎖o1");
}
}
}
}).start();
}
}
結(jié)果:
線程1鎖o1
線程2鎖o2
sleep方法和wait方法有什么區(qū)別?
此時(shí)如果把sleep()換成wait()會(huì)出現(xiàn)
線程1鎖o1
Exception in thread"Thread-0"線程2鎖o2
線程2鎖o1
java.lang.IllegalMonitorStateException
查看API發(fā)現(xiàn) java.lang.IllegalMonitorStateException拋出的異常表明某一線程已經(jīng)試圖等待對象的監(jiān)視器,或者試圖通知其他正在等待對象的監(jiān)視器而本身沒有指定監(jiān)視器的線程。
可以看出,sleep方法和wait方法都可以用來放棄CPU一定的時(shí)間,不同點(diǎn)在于如果線程持有某個(gè)對象的監(jiān)視器,sleep方法不會(huì)放棄這個(gè)對象的監(jiān)視器,wait方法會(huì)放棄這個(gè)對象的監(jiān)視器
Thread.sleep(0)的作用是什么?
Java中用到的線程調(diào)度算法是搶占式。一個(gè)線程用完CPU之后,操作系統(tǒng)會(huì)根據(jù)線程優(yōu)先級(jí)、線程饑餓情況等數(shù)據(jù)算出一個(gè)總的優(yōu)先級(jí)并分配下一個(gè)時(shí)間片給某個(gè)線程執(zhí)行。
由于Java采用搶占式的線程調(diào)度算法,因此可能會(huì)出現(xiàn)某條線程常常獲取到CPU控制權(quán)的情況,為了讓某些優(yōu)先級(jí)比較低的線程也能獲取到CPU控制權(quán),可以使用Thread.sleep(0)手動(dòng)觸發(fā)一次操作系統(tǒng)分配時(shí)間片的操作,這也是平衡CPU控制權(quán)的一種操作。
Semaphore有什么作用?
Semaphore是一個(gè)信號(hào)量,作用是限制某段代碼塊的并發(fā)數(shù)。Semaphore有一個(gè)構(gòu)造函數(shù),可以傳入一個(gè)int型整數(shù)n,表示某段代碼最多只有n個(gè)線程可以訪問,如果超出了n,那么請等待,等到某個(gè)線程執(zhí)行完畢這段代碼塊,下一個(gè)線程再進(jìn)入。
由此可以看出如果Semaphore構(gòu)造函數(shù)中傳入的int型整數(shù)n=1,相當(dāng)于變成了一個(gè)synchronized了。
總結(jié)
以上是生活随笔為你收集整理的java 死锁种类_用java写一个死锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汕头市队赛 SRM16 T2
- 下一篇: java 广义表_java 输入广义表