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

java多執行緒之死鎖

在java多執行緒裡,在同步中巢狀多個同步會造成死鎖執行緒。死鎖後的程式依然在執行,多個執行緒直接互相想要對方的鎖,而自己的鎖又沒有釋放。然後就造成了死鎖現象。大家都知道synchronized是會自動開關鎖的,使用它進行多層巢狀,就容易造成死鎖。解決死鎖的辦法就是不要多層巢狀同步。

死鎖的程式碼:

class ThreadDemos implements Runnable{

	private int count =100;
	public boolean flag = true;
	
	Object obj = new Object();
	
	@Override
	public void run() {
		while(count>0){
			if(flag){
				while(true){
					synchronized (obj) {
						sale();
					}	
				}
			}else{
				while(true){
					sale();
				}	
			}
		}
	}
	
	public  void sale(){
		if(count>0){
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			synchronized(obj){
				System.out.println(Thread.currentThread().getName()+"出售了票數:"+(100-count+1));
				count--;
			}
		}
	}
	
}

public class ThreadDeadLock {
	
	public static void main(String[] args) throws InterruptedException {
		ThreadDemos car= new ThreadDemos();
		Thread thread = new Thread(car);
		Thread thread1 = new Thread(car);
		thread.start();
		Thread.sleep(60);
		car.flag = false;
		thread1.start();
		
	}
}
Thread-1出售了票數:95
Thread-0出售了票數:96
Thread-0出售了票數:97
Thread-1出售了票數:98
Thread-0出售了票數:99
Thread-0出售了票數:100
雖然程式碼已經走完了,但是程式並沒有停止。


相關推薦

java執行

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

Java執行的出現和解決方法

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

java執行的例子

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

Java執行2.1.執行

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

java執行淺析

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

Java 執行實現場景

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

執行

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

Java執行

                         

從零開始學執行(八)

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

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

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

java執行同步(Lock)

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

Java執行,活,飢餓

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

Win32執行(DeadLock)

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

執行

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

java執行建立執行

執行緒建立篇    java中的執行緒建立有多種方式,筆者(ymh)這裡分別根據執行緒執行完畢後是否有返回值討論執行緒建立的四種方式。 1、通過繼承Thread類重寫run方法(無返回值) 示例程式碼:

java執行機制二

網上看到一個題目,題目是這樣:Java多執行緒,啟動四個執行緒,兩個執行加一,另外兩個執行減一。 針對該問題寫了一個程式,測試通過,如下: class Sync { static int count = 0; public void add() {

java執行機制一

網上看了一篇關於java synchronized關鍵字使用的很好的文章,現將其簡要總結一下,加深理解。 先總結兩個規則: synchronized鎖住的是括號裡的物件,而不是程式碼。對於非static的synchronized方法,鎖的就是物件本身也就是this。 多個執行緒

Java執行系列---“JUC”01 框架

轉自:http://www.cnblogs.com/skywang12345/p/3496098.html(含部分修改)   本章,我們介紹鎖的架構;後面的章節將會對它們逐個進行分析介紹。目錄如下: 01. Java多執行緒系列--“JUC鎖”01之 框架 02. 

Java執行系列---“JUC”02 ReentrantLock

轉自:https://www.jianshu.com/p/96c89e6e7e90 & https://blog.csdn.net/Somhu/article/details/78874634 (含部分修改) 一.ReentrantLock鎖 1.Lock介面 Lock,鎖

Java執行系列---“JUC”06 公平(下)

轉自:http://www.cnblogs.com/skywang12345/p/3496609.html 釋放公平鎖(基於JDK1.7.0_40) 1. unlock() unlock()在ReentrantLock.java中實現的,原始碼如下: public void unlock() {