1. 程式人生 > >java 中多執行緒之死鎖淺析

java 中多執行緒之死鎖淺析

出現死鎖的前提條件:

1.必須是至少2個以上的執行緒在執行;

2.同時要保證其中至少有兩個執行緒中的鎖(至少有兩個)是相同的,而且都有鎖的巢狀;

分析:首先要明確的是當兩個執行緒都擁有相同的鎖時候,誰先拿到鎖,誰就有執行權(比如執行緒①先拿到執行權),同時②執行緒就沒有執行權,除非①執行緒執行完畢釋放了鎖後,②執行緒才能執行。

然後看下面一個例子:我在例子中為大家分析死鎖是怎麼產生的

class DeadLock 
{
	public static void main(String[] args) 
	{
		Thread t1 = new Thread(new Test(true));
		Thread t2 = new Thread(new Test(false));
		t1.start();
		t2.start();
	}
}
class Test implements Runnable
{
	private boolean flag;
	static Object locka = new Object();//假如你把前面的static 去掉了,那麼就不會出現死鎖,為啥呢?因為鎖不一樣了,是4個不一樣的鎖(因為你new Test(true)和new Test(false));

	static Object lockb = new Object();
	Test(boolean flag)
	{
		this.flag = flag;
	}
	public void run()
	{
		if(flag)
		{
			synchronized(locka)
			{
				System.out.println("if locka..");//假如t1執行緒先拿到cpu執行權,那麼執行到這一行列印完if locka..後,因某種原因有可能t1暫時休眠了,t2開始拿到cpu執行權,列印完else lockb..後,就不能在列印else locka..了,因為他進不去,為啥呢,因為t1拿著鎖locka的鑰匙呢,這時候有可能t1醒了,但是他列印不了if lockb..,因為t2拿著鎖lokcb的鑰匙呢  這樣就鎖死了。也就是說誰拿著鑰匙,誰就能開鎖,就能執行,雖然別人有相同的鎖但是你沒有鑰匙,那就白搭。
				synchronized(lockb)
				{
					System.out.println("if lockb..");
				}
			}	
		}
		else
		{	
			synchronized(lockb)
			{
				System.out.println("else lockb......");
				synchronized(locka)
				{
					System.out.println("else locka......");
				}
			}
		}
	}
}



相關推薦

java 執行淺析

出現死鎖的前提條件: 1.必須是至少2個以上的執行緒在執行; 2.同時要保證其中至少有兩個執行緒中的鎖(至少有兩個)是相同的,而且都有鎖的巢狀; 分析:首先要明確的是當兩個執行緒都擁有相同的鎖時候,誰先拿到鎖,誰就有執行權(比如執行緒①先拿到執行權),同時②執行緒就沒有執

Java執行2.1.執行

多執行緒之死鎖 1、鎖物件Lock 雖然我們可以理解同步程式碼塊和同步方法的鎖物件問題,但是我們並沒有直接看到在哪裡加上了鎖,在哪裡釋放了鎖。 為了更清晰的表達如何加鎖和釋放鎖,JDK5以後提

java執行

在java多執行緒裡,在同步中巢狀多個同步會造成死鎖執行緒。死鎖後的程式依然在執行,多個執行緒直接互相想要對方的鎖,而自己的鎖又沒有釋放。然後就造成了死鎖現象。大家都知道synchronized是會自

Java執行的出現和解決方法

什麼是死鎖?死鎖是這樣一種情形:多個執行緒同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放.由於執行緒被無限期地阻塞,因此程式不能正常執行.形象的說就是:一個寶藏需要兩把鑰匙來開啟,同時間正好來了兩個人,他們一人一把鑰匙,但是雙方都再等著對方能交出鑰匙來開啟寶藏,誰都沒

java執行的例子

在java多執行緒編寫程式中特別害怕的一種情況就是死鎖,他會讓程式死在哪裡不在繼續執行下面就來看一個死鎖的例子: /** * 死鎖的例子 */ public class SiSuoTest

執行

* 死鎖:常見情景之一:同步的巢狀 * @author 羅摩銜那 * */ class Ticketeds implements Runnable { private int num=100; Object obj=new Object(); boolean flag=tr

從零開始學執行(八)

死鎖 每個人手裡都有其他人需要的資源,自己又不會放下手上的資源,這麼一直等待下去,就會發生死鎖. 當一個執行緒永遠佔有一個鎖,而其他執行緒嘗試去獲得這個鎖,那麼它們將永遠被阻塞. 當執行緒A佔有鎖L時,想要獲得鎖M,同時執行緒B持有M,並嘗試得到L,兩個執行緒將永遠等待下去,這種情況是死鎖最簡單的形式(或稱致

併發執行-----哲學家吃飯問題

該例子說明了4點出現死鎖需要同時滿足的條件: 互斥條件:任務使用的資源至少有一個是不能共享的。這裡,一根chopstick(筷子)一次就只能讓一個philosopher(哲學家)使用。 至少有一個任務它必須持有一個資源且正在等待獲取另一個當前被別的任務持有的

Win32執行(DeadLock)

為每一個連結串列(linked list)準備一個critical section之後(關於連結串列,請參看”“,我卻開始了另一個問題。請看下面這個用來交換兩個連結串列內容的函式: void SwapLists(List  *listA, List * listB) {  

執行

死鎖:同步中巢狀同步。 class  Test  implements  Runnable//多執行緒的表現形式 {          private  boolean  flag;//定義一個標誌          Test(boolean flag)//建構函式    

Java筆記-執行執行問題加簡單舉例

死鎖 導致死鎖的原因 Java中死鎖最簡單的情況是,一個執行緒T1持有鎖L1並且申請獲得鎖L2,而另一個執行緒T2持有鎖L2並且申請獲得鎖L1,因為預設的鎖申請操作都是阻塞的,所以執行緒T1和T2永遠被阻塞了。導致了死鎖。 這是最容易理解也是最簡單的死

Java 執行實現場景

簡述: 《Java 程式設計思想》  P718 ~ P722 模擬死鎖的場景, 三個人 三根筷子,每個人需要拿到身邊的兩根筷子才能開始吃飯 出現死鎖的場景是,三個人都拿到了右邊的筷子,但是由於筷子都被搶佔,均無法獲得左邊的筷子 Chopstick.java

Java基礎執行執行安全-同步三種形式

首先,我們通過一個案例,演示執行緒的安全問題: 電影院要賣票,我們模擬電影院的賣票過程。假設要播放的電影是 “葫蘆娃大戰奧特曼”,本次電影的座位共100個(本場電影只能賣100張票)。我們來模擬電影院的售票視窗,實現多個視窗同時賣 “終結者”這場電影票(多個視窗一起賣這100張票)需要視窗

Java執行

                         

Java執行12:執行

Java執行緒死鎖是一個經典的多執行緒問題,因為不同的執行緒都在等待根本不可能被釋放的鎖,從而導致所有的任務都無法繼續完成。在多執行緒技術中,“死鎖”是必須避免的,因為這會造成執行緒的“假死”。 pac

Python學習【第24篇】:,遞迴,訊號量,Event事件,執行Queue python併發程式設計執行2------------與遞迴,訊號量等

python併發程式設計之多執行緒2------------死鎖與遞迴鎖,訊號量等 一、死鎖現象與遞迴鎖 程序也是有死鎖的 所謂死鎖: 是指兩個或兩個以上

java執行同步(Lock)

      從Java5開始,提供了Lock, Lock提供了比synchronized方法和synchronized程式碼塊更廣泛的鎖定操作,Lock可以實現更靈活的結構,並且支援多個相關的Condition物件(物件監視器)。       Lock是控制多個執行緒對共享

Java執行,活,飢餓

死鎖:是指兩個或兩個以上的程序(或執行緒)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。 死鎖發生在當一些程序請求其他程序佔有的資源而被阻塞時。 死鎖發

java面試題---請用執行

java面試題---用多執行緒寫死鎖 (請參考本部落格對同步鎖的文章進行理解) public class dead { public static void main(String[] args)

執行同步執行停止

一.同步程式碼塊(同步鎖) 寫法: synchronized(鎖){ 上鎖的程式碼 } 當執行緒進入同步程式碼塊 會把鎖拿走 執行程式碼塊中的程式碼 程式碼執行完畢後 會把鎖還回去 如果執行緒遇到同步程式碼塊 發現沒有鎖 將進入等待(有鎖才可進) 鎖的注意:保證所有執行緒使用的是同一個鎖