`

Java死锁简单实例

阅读更多
代码转自: 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 一个死锁的例子

    在Java编程中,死锁是并发编程中一个重要的概念,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。这个例子中,我们将会深入探讨死锁的产生、识别以及如何避免它。 首先,让我们理解...

    Java中死锁的例子

    下面将详细解释Java中的死锁现象,并通过一个具体的例子来说明。 死锁的四个必要条件: 1. 互斥条件:至少有一个资源是不能同时被两个线程持有的,即一次只有一个线程可以访问。 2. 请求与保持条件:一个线程已经...

    Java 死锁示例性源代码

    本源代码是博客《Java 多线程编程之七:死锁(附源代码)》附带的实例性源代码。原博客链接地址:http://blog.csdn.net/defonds/archive/2010/01/26/5258120.aspx。

    一个java线程池死锁的例子

    线程池里的线程等待等待队列里的线程执行,等待队列里的等待线程池里的完成,相互等待

    java线程死锁实例

    Java线程死锁是多线程编程中一个常见的问题,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。死锁的发生通常涉及到四个必要条件:互斥、请求与保持、不剥夺和循环等待。理解并解决Java...

    Java解决死锁问题eclipse代码版

    在Java编程中,死锁是多线程环境下常见的问题,当两个或多个线程相互等待对方释放资源,导致它们都无法继续执行时,就会出现死锁。`synchronized`关键字是Java提供的一种内置锁机制,用于控制对共享资源的并发访问,...

    Java线程死锁实例及解决方法

    Java线程死锁实例及解决方法 Java线程死锁是一种特殊的线程状态,发生死锁时,多个线程会相互等待,无法继续执行,直到外部干预。下面是Java线程死锁实例及解决方法的详细介绍。 一、死锁的定义 所谓死锁是指多个...

    java多线程死锁预防机制研究

    以下是一个简单的Java代码示例,展示了如何使用`ReentrantLock`来预防锁饥饿和死锁: ```java import java.util.concurrent.locks.ReentrantLock; public class LockExample { private final ReentrantLock lock ...

    Java线程的简单例子

    Java提供了一些工具如jstack和VisualVM来诊断和解决死锁问题。 总结起来,Java线程涉及的内容广泛,包括线程的创建、控制、同步以及线程池的使用。理解这些知识点对于编写高效、安全的多线程Java应用程序至关重要。...

    死锁_Java产生死锁的简单案例

    本文通过一个简单的化妆类(Markup)和两个对象——口红(LipStick)和镜子(Mirror)的案例,展示了如何在Java中产生死锁。化妆类中的线程尝试同时持有这两个对象的锁,但顺序不同,从而导致了死锁。 首先,我们...

    死锁算法 Java实现 操作系统

    本教程将通过Java实现死锁的模拟,帮助学习者理解这一复杂的概念,并提供一个简单的、易于理解的解决方案。 首先,我们需要了解死锁的四个必要条件: 1. **互斥条件**:资源必须被单个进程独占,即在同一时刻,...

    Java中常见死锁与活锁的实例详解

    Java 中常见死锁与活锁的实例详解 Java 中的死锁和活锁是一种常见的并发编程问题,它们可能会导致程序崩溃或性能下降。在 Java 中,死锁和活锁的实例详解是指在多线程编程中,多个线程在访问共享资源时,可能会...

    java线程死锁代码示例

    本文主要介绍了java线程死锁代码示例,分享了一个简单线程死锁的例子,需要的朋友可以参考下。以下是对该示例的详细解释和知识点总结: 1. 死锁的概念:死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 ...

    Java 线程死锁的问题解决办法

    在这个例子中,我们可以看到线程死锁的问题是如何发生的,以及我们如何解决这个问题。 五、总结: Java 线程死锁的问题解决办法是非常重要的。在编写代码时,我们应该避免嵌套锁定,使用锁定的顺序,使用并发容器...

    JAVA_线程同步与死锁

    一个详细讲解JAVA_线程同步与死锁的例子 希望可以帮助到你。

    什么是死锁,如何避免死锁?Java死锁详解

    在Java中,死锁的实例可以通过一个简单的代码示例来解释。考虑以下情况: ```java public class DeadThread { private Thread thread1; public DeadThread(Object object1, Object object2){ thread1 = new ...

    详解java中产生死锁的原因及如何避免

    从这两个例子,我们可以得出结论,产生死锁可能性的最根本原因是:线程在获得一个锁L1的情况下再去申请另外一个锁L2,也就是锁L1想要包含了锁L2,也就是说在获得了锁L1,并且没有释放锁L1的情况下,又去申请获得锁L2...

    一个简单的和死锁有关的程序

    标题:一个简单的和死锁有关的程序 描述与分析: 本程序通过两个`DeadThread`线程类实例和两个`Test`对象实例演示了死锁(deadlock)现象。死锁是多线程编程中常见的一种问题,发生在多个线程相互等待对方释放资源...

    Java 实例 - 死锁及解决方法源代码+详细指导教程.zip

    本教程将深入探讨Java中的死锁问题及其解决策略,通过实例源代码帮助你更好地理解和避免这种情况。 1. **死锁定义**: 死锁是指两个或多个并发执行的线程在执行过程中,因争夺资源而造成的一种相互等待的现象,若...

    Java 解决死锁的方法实例详解

    Java中的死锁问题是一个多线程编程中常见的挑战,它发生在两个或更多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。死锁的产生有四个必要条件:互斥使用、不可抢占、请求和保持以及循环等待。理解这些...

Global site tag (gtag.js) - Google Analytics