当前位置:首页 > 开发 > 编程语言 > Java > 正文

Java死锁简单实例

发表于: 2013-11-24   作者:alleni123   来源:转载   浏览次数:
摘要: 代码转自: http://leowzy.iteye.com/blog/740859 public class DeadLocker implements Runnable { int field_1; private Object lock_1=new int[1]; int field_2; private Object lock_2=new i
代码转自: http://leowzy.iteye.com/blog/740859

public class DeadLocker  implements Runnable
{
	int field_1;
	
	private Object lock_1=new int[1];
	
	int field_2;
	
	private Object lock_2=new int[1];
	
	public void method1(int value){
		synchronized (lock_1){	
			System.out.println(Thread.currentThread().getName()+ "lock1");
			synchronized (lock_2){
				field_1=0;field_2=0;
			}
		}
	}
	
	
	public void method2(int value){
		synchronized (lock_2){
			System.out.println(Thread.currentThread().getName()+ "lock2");
			synchronized (lock_1){
				field_1=0;field_2=0;
			}
		}
	}
	 

	@Override
	public void run()
	{
		method1(2);
		method2(1);
	}
	 
	public static void main(String[] args)
	{	
		DeadLocker d=new DeadLocker();
		Thread t1=new Thread(d,"Thread_monkey");
		Thread t2=new Thread(d,"Thread dolphin");
		t1.start();
		t2.start();
	}
}


程序的运行会产生很多种不同的结果,有的是顺利执行完毕,大多数都会产生死锁:

1. Thread_monkey lock1
Thread_monkey lock2
Thread dolphin lock1
Thread dolphin lock2
这种是顺利执行完毕的。因为monkey线程执行完毕后dolphin才开始执行。这种可以忽略。

2. Thread_monkey lock1
   Thread_monkey lock2
   Thread dolphin lock1
monkey在执行到method2()的时候,dolphin正好开始执行。
此时dolphin进入到了method1()的synchronized (lock_1),而monkey则进入到了method2()的synchronized(lock_2)。
这时两个线程分别在之前的synchronized块中锁定了对方接下来所要锁定的资源。
既是:
   线程         已锁定对象      需要对象
   monkey ->      lock_2          lock_1
   dolphin->      lock_1          lock_2

两个线程都在锁定了对方所需要的对象,同时等待对方释放自己需要的对象。
程序进入死锁状态。


具体细节都在上面的链接里。

Java死锁简单实例

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作。 一、准备工作(
   Web Service 是一种新的web应用程序分支,他们是自包含、自描述、模块化的应用,可以发布、定
MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做
本实例是提供给刚开始用java连接MongoDB的人,奔着简单,清晰,快速上手的原则,特发此实例 数据库
例子程序: import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorSe
/* * File name: TestHelloService.java * * Version: v1.0 * * Created on Aug 2, 2008 9:54:10 AM
Graphics2D、Rectangle2D、Ellipse2D、Line2D的简单应用,原理为创建相应的图形对象,并设置图形的大
利用Java编写简单的WebService实例 使用Axis编写WebService比较简单,就我的理解,WebService的实现
使用Axis编写WebService比较简单,就我的理解,WebService的实现代码和编写Java代码其实没有什么区
使用Axis编写WebService比较简单,就我的理解,WebService的实现代码和编写Java代码其实没有什么区
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号