1. 程式人生 > >死鎖的誕生,寫一個簡單的死鎖例項

死鎖的誕生,寫一個簡單的死鎖例項

在實際程式設計中,要儘量避免出現死鎖的情況,但是讓你故意寫一個死鎖的程式時似乎也不太簡單(有公司會出這樣的面試題),以下是一個簡單的死鎖例子。

執行緒的同步化可能會造成死鎖,死鎖發生在兩個執行緒相互持有對方正在等待的東西(實際是兩個執行緒共享的東西)。只要有兩個執行緒和兩個物件就可能產生死鎖。

/** * 一個簡單的死鎖類 * 當DeadLock類的物件flag==1時(td1),先鎖定o1,睡眠500毫秒 * 而td1在睡眠的時候另一個flag==0的物件(td2)執行緒啟動,先鎖定o2,睡眠500毫秒 * td1睡眠結束後需要鎖定o2才能繼續執行,而此時o2已被td2鎖定; * td2睡眠結束後需要鎖定o1才能繼續執行,而此時o1已被td1鎖定;
* td1、td2相互等待,都需要得到對方鎖定的資源才能繼續執行,從而死鎖。 */

package 測試包;

public class deadLock implements Runnable{
	public int flag=1;
	private static Object o1=new Object(), o2=new Object();
	
	
	@Override
	public void run() {
	
		System.out.println("falg is"+flag);
		if(flag==1){
			synchronized (o1) {
			 try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			synchronized (o2) {
			   System.out.println("flag 1 is running");	
			}	
			 
			 
			}
			
		}
		if(flag==0){
			synchronized (o2) {
			 try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			synchronized (o1) {
			   System.out.println("flag 1 is running");	
			}	
			 
			 
			}
			
		}
		
		
		
	}

	
	public static void main(String[] args) {  
		
		deadLock deadLock1 = new deadLock();
		deadLock deadLock2 = new deadLock();
		deadLock1.flag=1;
		deadLock2.flag=0;
		new Thread(deadLock1).start();
		new Thread(deadLock2).start();
		
	}
	//造成死鎖
	
}


相關推薦

誕生一個簡單例項

在實際程式設計中,要儘量避免出現死鎖的情況,但是讓你故意寫一個死鎖的程式時似乎也不太簡單(有公司會出這樣的面試題),以下是一個簡單的死鎖例子。執行緒的同步化可能會造成死鎖,死鎖發生在兩個執行緒相互持有對方正在等待的東西(實際是兩個執行緒共享的東西)。只要有兩個執行緒和兩個物件

java多執行緒上機題一個簡單程式

下面是一個非常簡單的會出現死鎖的程式: */package com.richinfo.cn.thread; /** * @author : Allen(Wu Zhiwei) * @date 建立

初學javascript一個簡單的階乘算法當作練習

info 學java 簡單的 png 練習 分享圖片 write img var 代碼如下: <script> var a = prompt("請輸入值"); function mul(a){ if(a==1){ return 1; }

spring tool suite新建spring starter project一個簡單的html頁面並執行出來

   我用的spring tool suite 版本是3.8.0     剛剛使用spring tool suite 這個工具,這個工具還是挺好用的,不用再在配置檔案上花很多時間,它可以幫我們配置好。    廢話不多說,首先新建一個spring starter proj

java 線程問題一個(原理:只有互相都等待對方放棄資源才會產生死

() ati ron args start print println class log package com.swift; public class DeadLock implements Runnable { private boolean flag;

併發處理:一個例項和執行緒監控

鎖 鎖是一個非常有用的工具,運用的場景非常多,因為他使用起來非常的簡單,而且易於理解。但是,鎖的問題就是很可能會出現一個非常壞的事情,就是一旦造成死鎖,就會導致執行緒得不到釋放,一旦死鎖的執行緒出現的太多,就會造成系統的不可用。 一、死鎖的例子 學習掌握一個概念,最好的方法就

多執行緒程式設計(一)——一個簡單

(整個九月忙著找工作,好多收穫,好多遺憾,最終結局還可以接受,技術路還很遠,再接再厲!面去哪兒網時,寫慣了演算法的我突然讓寫了幾個多執行緒程式設計,有點矇蔽,最近好好整理一下) 死鎖發生的原因: 1、

一個 java 玩玩

java 死鎖很容易遇到,睡不著 寫一個 死鎖 上程式碼 package cn.nokia.rso; public class DeadLock { private st

用集合一個簡單的隨機分組以及集合內元素數量查詢

移除 以及 表示 元素 move spa color 查詢 println 12個人,隨機分為4組 public static void main(String[] args) { List list = new ArrayList();

一個簡單的python腳本來返回ip地址的掩碼子網個數等

pypi package 多少 ask pri 1.2 bfc pty rom 如果我們想快速得到一個IP地址段有多少個ip,快速得到IP地址段的子網掩碼,或者快速得到一個IP地址的二進制,那麽可以來學習一下。本文利用python的一個IP分析模塊IPy實現,首先安裝IPy

一個簡單的form表單當光標離開表單的時候表單的值發送給後臺

bsp name clas blog var tex txt rip () 1 <body> 2 <form action="index.php"> 3 <input type="text" name="txt" id="txt

一個簡單vue 中間件$emit、$on

發布-訂閱模式 pre 原理 lse 取出 als new on() 訂閱 前言 使用過vue的同學大多數都知道$emit 與$on的使用。我們僅僅知道使用,有時候是完全不夠的。現在我就帶領大家寫一個簡單類似於vue空實例的中間件。 非父子組件的通信 非父子組件的通信vue

用C語言一個簡單的三子棋實現玩家與電腦的對戰

原始碼: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 寫一個三子棋 */ //邏輯: //1. 畫

如何一個簡單的猜數字遊戲?60行程式碼搞定進來轉轉吧

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> void menu() { printf("******************************\n"); printf(“歡迎來到猜數

使用面向物件的程式設計思想一個簡單的控制檯計算器程式放鬆一下

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calc

vue.js如何一個簡單的原生js模組瀏覽器中的表現如何?

請點選此處輸入圖片描述瀏覽器正在逐步的支援原生JavaScript模組。Safari和Chrome的最新版本已經支援它們了,Firefox和Edge也將很快推出。如果您是一個vue.js使用者,那關於JavaScript模組一個很酷的事就是他們允許您編寫您的元件到自己的檔案中

使用 js自己一個簡單的滾動條

back http 之前 fun 完全 light get ini 計算 當我們給元素加上 overflow: auto; 的時候,就會出現滾動條,然而瀏覽的不同,滾動條的樣式大不一樣,有些甚至非常醜。 於是就想著自己寫一個滾動條,大概需要弄清楚一下這幾個點: 1、滾

linux設備驅動第三篇:一個簡單的字符設備驅動

提示 copy flags 驅動程序 相關 clas open ugo param 在linux設備驅動第一篇:設備驅動程序簡介中簡單介紹了字符驅動,本篇簡單介紹如何寫一個簡單的字符設備驅動。本篇借鑒LDD中的源碼,實現一個與硬件設備無關的字符設備驅動,僅僅操

采用jsp頁面與java代碼分離的方式一個簡單的二維表

color arraylist 一個 3-9 業務 動態顯示 復雜 分層架構 方式 前提:在我們做程序時追求的是高內聚,低耦合,但是如果我們把jsp頁面的的代碼和java的代碼都放在了jsp的代碼編寫中,使java和jsp高耦合這樣的話不僅使jsp代碼頁面顯得很復雜,而

一個簡單的導航

utf-8 mar title shee 小圖標 list .cn display left 制作一個如下圖的導航按鈕。當鼠標移入導航欄的首頁,商店等字體時,前面的小圖標和字顏色一起變紅!代碼如下: <meta charset="UTF-8"> <