`
Copperfield
  • 浏览: 260950 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25207
社区版块
存档分类

死锁的例子

 
阅读更多
/**
 * Description:
 * <br/>Copyright (C), 2008-2010, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee kongyeeku@163.com
 * @version  1.0
 */
class A
{
    public synchronized void foo( B b )
	{
		System.out.println("当前线程名: " + 
			Thread.currentThread().getName() + " 进入了A实例的foo方法" );
		try
		{
			Thread.sleep(200);
		}
		catch (InterruptedException ex)
		{
			ex.printStackTrace();
		}
		System.out.println("当前线程名: " + 
		Thread.currentThread().getName() + " 企图调用B实例的last方法");
		b.last();
	}

	public synchronized void last()
	{
		System.out.println("进入了A类的last方法内部");
	}
}

class B
{
	public synchronized void bar( A a )
	{
		System.out.println("当前线程名: "
			+ Thread.currentThread().getName() + " 进入了B实例的bar方法" );
		try
		{
			Thread.sleep(200);
		}
		catch (InterruptedException ex)
		{
			ex.printStackTrace();
		}
		System.out.println("当前线程名: " 
		+ Thread.currentThread().getName() + " 企图调用A实例的last方法");
		a.last();
	}

	public synchronized void last()
	{
		System.out.println("进入了B类的last方法内部");
	}
}

public class DeadLock implements Runnable
{
	A a = new A();
	B b = new B();

	public void init()
	{
		Thread.currentThread().setName("主线程");
		//调用a对象的foo方法
		a.foo(b);
		System.out.println("进入了主线程之后");
	}
	public void run()
	{
		Thread.currentThread().setName("副线程");
		//调用b对象的bar方法
		b.bar(a);
		System.out.println("进入了副线程之后");
	}
	public static void main(String[] args)
	{
		DeadLock dl = new DeadLock();
		//以dl为target启动新线程
		new Thread(dl).start();
		//执行init方法作为新线程
		dl.init();
	}
}

主线程保持着A对象的锁,等待B对象的锁。子线程保持着B对象的锁,等待A对象的锁。2个线程互相等待对方释放锁,造成死锁。

分享到:
评论

相关推荐

    innodb GAP LOCK 死锁例子1

    InnoDB GAP LOCK 死锁例子1 InnoDB 的记录锁机制是 MySQL 中最为复杂和强大的锁机制之一。Gap Lock 是 InnoDB 中的一种锁机制,它的主要作用是避免幻读(Phantom)问题。 在 InnoDB 中,记录锁机制可以分为三种...

    线程死锁的例子

    在我们的例子“ConsoleApplication1”中,很可能包含了一个模拟线程死锁的简单控制台应用程序。通过这样的实例,我们可以深入理解线程是如何在操作系统中分配CPU时间片进行工作的。在单处理器系统中,线程不是同时...

    java 一个死锁的例子

    这个例子中,我们将会深入探讨死锁的产生、识别以及如何避免它。 首先,让我们理解什么是死锁。在多线程环境中,当两个线程A和B分别持有对方需要的资源并等待对方释放时,就会发生死锁。例如,线程A持有资源1并请求...

    mysql死锁的一些案例

    MySQL数据库在处理并发事务时,可能会遇到一种特殊的情况,即死锁。死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。死锁是数据库系统中常见的问题,...

    分布式死锁的一个例子

    在上述例子中,问题的关键在于`rdr.read()`方法的使用方式,它没有一次性从SQL服务器获取所有数据,而是按需读取。这种方式可能导致网络I/O等待,因为服务器可能需要等待客户端程序来接收更多的数据。 具体来说,当...

    C例子:死锁

    该程序是我写的博客“一起talk C栗子吧(第一百一十八回:C语言实例--线程死锁二)”的配套程序,共享给大家使用

    Java中死锁的例子

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

    SQL Server死锁总结

    ### SQL Server死锁总结 #### 一、死锁原理 死锁是计算机系统中常见的问题之一,特别是在数据库管理系统中,由于并发控制不当可能导致系统性能下降甚至完全停止响应。在SQL Server中,死锁指的是两个或多个事务...

    计算机操作系统课件:第4章进程同步与通信-死锁03.ppt

    交通死锁是一个经典的死锁例子,它说明了当多个进程都等待对方释放资源时,会导致系统僵持的情况。进程竞争外部设备的死锁例子则展示了当多个进程竞争同一个资源时,可能会导致死锁的产生。 关于死锁的一些结论是:...

    操作系统常用的死锁程序

    在这个程序示例中,我们看到一个模拟哲学家进餐问题的场景,这是经典的死锁例子,用于阐述操作系统中的并发控制和死锁预防策略。让我们深入探讨这个程序的各个组成部分以及它们与操作系统死锁相关的知识点。 首先,...

    Mysql 数据库死锁过程分析(select for update)

    FOR UPDATE`语句时遇到的死锁情况,并通过具体的例子深入分析了死锁的原因。 `SELECT ... FOR UPDATE`语句用于在事务中锁定查询到的行,以确保在事务结束之前其他事务无法修改这些行。在InnoDB存储引擎中,行级锁...

    操作系统概念英文课件:Chapter 7 Deadlocks.ppt

    一个典型的死锁例子是,当系统有两台磁带驱动器时,进程P1和P2各持有一台,并且都需要对方持有的那台。类似地,如果两个进程分别持有信号量A和B,同时都在等待对方持有的资源,也会形成死锁。 桥的例子进一步阐述了...

    死锁典型例题,对理解死锁的计算类题目有帮助

    这些例子展示了死锁的多样性和复杂性,旨在帮助读者更好地理解死锁的计算类题目。通过这些例子,我们可以看到死锁的出现是由于资源的竞争和互斥所引起的,了解死锁的机理和解决方法是非常重要的。

    C例子:死锁too

    该程序是我写的博客“一起talk C栗子吧((第一百一十九回:C语言实例--线程死锁三)”的配套程序,共享给大家使用

    一个java线程池死锁的例子

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

    张逸凯_171840708_操作系统第三章作业1

    最后,针对问题31至33,讨论了独木桥问题,这是一个经典的死锁例子。当两辆车分别占据桥的不同部分时,它们互相等待对方先让路,形成了死锁。通过引入信号量mutex,可以实现车辆的互斥通过,防止死锁。如果增加车辆...

    基于Petri网的并发编程死锁预防策略 (2012年)

    针对并发编程中的死锁问题,提出了一种具有同步信号的并发程序的Petri网模型――S3PS(简单连续信号进程系统)网,这种Petri网子类保持活性的充分必要条件是它的虹吸非空.在此基础上,通过对严格极小虹吸加入控制弧...

    操作系统题目共享.ppt

    5. **死锁预防**:哲学家进餐问题是操作系统中经典的死锁例子。文中提供的算法使用记录型信号量避免了死锁。每个哲学家在拿起筷子前都需要先进行P操作,放下筷子后执行V操作。通过控制相邻两筷子的获取顺序,确保...

    MySQL死锁问题分析及解决方法实例详解

    这就是一个典型的死锁例子,MySQL会记录死锁日志,并在检测到死锁后选择一个事务进行回滚。 总的来说,理解MySQL的锁机制以及如何预防和解决死锁是数据库管理的关键技能。在设计和优化数据库操作时,应考虑事务的...

    操作系统实验一(4).doc

    4. **死锁避免**:哲学家进餐问题是一个经典的死锁例子,因为每个哲学家都需要两根筷子才能吃饭,而筷子是共享资源。实验中通过限制最多4个哲学家同时进餐,确保总有一根筷子可用,从而防止死锁的发生。 5. **同步...

Global site tag (gtag.js) - Google Analytics