java 死锁种类_用java写一个死锁
什么是死鎖?
多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止。
不適當的使用“synchronized”關鍵詞來管理線程對特定對象的訪問。
“synchronized”關鍵詞的作用是,確保在某個時刻只有一個線程被允許執行特定的代碼塊,因此,被允許執行的線程首先必須擁有對變量或對象的排他性的訪問權。當線程訪問對象時,線程會給對象加鎖,而這個鎖導致其它也想訪問同一對象的線程被阻塞,直至第一個線程釋放它加在對象上的鎖。
packagecom.練習鎖;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);//讓當前線程睡眠,保證讓另一線程得到o2,防止這個線程啟動一下連續獲得o1和o2兩個對象的鎖。
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();
}
}
結果:
線程1鎖o1
線程2鎖o2
sleep方法和wait方法有什么區別?
此時如果把sleep()換成wait()會出現
線程1鎖o1
Exception in thread"Thread-0"線程2鎖o2
線程2鎖o1
java.lang.IllegalMonitorStateException
查看API發現 java.lang.IllegalMonitorStateException拋出的異常表明某一線程已經試圖等待對象的監視器,或者試圖通知其他正在等待對象的監視器而本身沒有指定監視器的線程。
可以看出,sleep方法和wait方法都可以用來放棄CPU一定的時間,不同點在于如果線程持有某個對象的監視器,sleep方法不會放棄這個對象的監視器,wait方法會放棄這個對象的監視器
Thread.sleep(0)的作用是什么?
Java中用到的線程調度算法是搶占式。一個線程用完CPU之后,操作系統會根據線程優先級、線程饑餓情況等數據算出一個總的優先級并分配下一個時間片給某個線程執行。
由于Java采用搶占式的線程調度算法,因此可能會出現某條線程常常獲取到CPU控制權的情況,為了讓某些優先級比較低的線程也能獲取到CPU控制權,可以使用Thread.sleep(0)手動觸發一次操作系統分配時間片的操作,這也是平衡CPU控制權的一種操作。
Semaphore有什么作用?
Semaphore是一個信號量,作用是限制某段代碼塊的并發數。Semaphore有一個構造函數,可以傳入一個int型整數n,表示某段代碼最多只有n個線程可以訪問,如果超出了n,那么請等待,等到某個線程執行完畢這段代碼塊,下一個線程再進入。
由此可以看出如果Semaphore構造函數中傳入的int型整數n=1,相當于變成了一個synchronized了。
總結
以上是生活随笔為你收集整理的java 死锁种类_用java写一个死锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汕头市队赛 SRM16 T2
- 下一篇: java 广义表_java 输入广义表