`
baby69yy2000
  • 浏览: 187727 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
社区版块
存档分类
最新评论

模拟线程死锁

阅读更多
synchronized 特点: 两个synchronized 方法,当一个线程已经获取锁定,其它线程就不能再执行同一实例的synchronized 方法.
synchronized 方法可以执行.

下面开始模拟死锁现象
package com.apq.deadlock;

//餐具类
class Tableware {
	private final String name;
	public Tableware(String name) {
		this.name = name;
	}
	
	public String toString() {
		return " [ " + name + " ] ";
	}

}

class EaterThread extends Thread {
	private String name;
	private final Tableware lefthand;
	private final Tableware righthand;
	
	public EaterThread(String name, Tableware spoon, Tableware fork) {
		this.name = name;
		this.lefthand = spoon;
		this.righthand = fork;
	}
	
	public void run() {
		while (true) {
			this.eat();
		}
	}

	private void eat() {
		synchronized (this.lefthand) {
			System.out.println(this.name + " 左手拿了 " + this.lefthand);
			synchronized (this.righthand) {
				System.out.println(this.name + " 右手拿了 " + this.righthand);
				System.out.println("吃...");
			}
		}
	}

}

public class Main {

	public static void main(String[] args) {
		Tableware spoon = new Tableware("匙子");
		Tableware fork = new Tableware("叉子");
		new EaterThread("apq", spoon, fork).start();
		new EaterThread("bob", fork, spoon).start();
	}

}


结果:
apq抱着匙子不放,bob抱着叉子不放,谁也不能吃了
apq 左手拿了  [ 匙子 ]
apq 右手拿了  [ 叉子 ]
吃...
apq 左手拿了  [ 匙子 ]
bob 左手拿了  [ 叉子 ]

把锁的粒度加大些,可以避免死锁
package com.apq.deadlock;

//餐具类
class Tableware {
	private final String name;
	public Tableware(String name) {
		this.name = name;
	}
	
	public String toString() {
		return " [ " + name + " ] ";
	}

}

class Pair {
	private final Tableware lefthand;
	private final Tableware righthand;
	public Pair(Tableware spoon, Tableware fork) {
		this.lefthand = spoon;
		this.righthand = fork;
	}
	
	public String toString() {
		return "Pair [lefthand=" + lefthand + ", righthand=" + righthand + "]";
	}
}

class EaterThread extends Thread {
	private String name;
	private final Pair pair;
	
	public EaterThread(String name, Pair pair) {
		this.name = name;
		this.pair = pair;
	}
	
	public void run() {
		while (true) {
			this.eat();
		}
	}

	private void eat() {
		synchronized (this.pair) {
			System.out.println(this.name + " 拿了 " + this.pair);
			System.out.println("吃...");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

public class Main1 {

	public static void main(String[] args) {
		Tableware spoon = new Tableware("匙子");
		Tableware fork = new Tableware("叉子");
		Pair pair = new Pair(spoon, fork);
		new EaterThread("apq", pair).start();
		new EaterThread("bob", pair).start();
	}

}




分享到:
评论

相关推荐

    java模拟线程死锁

    Java 模拟线程死锁 线程死锁 在 Java 中,线程死锁(Deadlock)是一种特殊的情况,发生在两个或多个线程之间的互相等待对方释放资源的状态。这种情况下,各个线程都在等待其他线程释放资源,而自己也占用着其他...

    线程死锁的例子

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

    Linux系统线程死锁实验报告.pdf

    `sleep()`函数使得线程暂停执行指定的秒数,它在代码中被用于模拟线程执行所需时间。这有助于保证线程间的资源竞争和死锁的产生。 9. 代码错误处理: 在实验代码中,包含了错误处理逻辑,例如使用`pthread_mutex_...

    Delphi多线程Demo

    在IT领域,多线程编程是一项重要的技术,它允许程序同时执行多个任务,提升系统效率。在Windows平台上,开发者常使用API函数来实现多线程,例如`CreateThread`。本篇文章将深入探讨如何在Delphi环境下利用`...

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

    在上面的代码模拟中,我们可以看到 DeadLockThread1 和 DeadLockThread2 两个线程,它们之间相互等待锁定的资源obj 和 obj1,从而造成了线程死锁。 二、线程死锁的检测: 要检测线程死锁,我们可以使用 jconsole ...

    矩阵在计算机线程死锁的检测与防止中的应用1

    【标题】:“矩阵在计算机线程死锁的检测与防止中的应用1” 【主题】:本文探讨了在多线程操作系统中如何利用矩阵方法来检测和预防死锁问题。死锁是多进程环境下常见的问题,当多个进程互相等待对方持有的资源而...

    Java实现线程死锁

     春节的时候去面试了一家公司,笔试题里面有一道是使用简单的代码实现线程的‘死锁’,当时没有想到这道题考的是Synchronized关键字,于是自己定义了两个资源模拟了一下。后面想想肠子都悔青了,于是自己在电脑上...

    java线程死锁代码示例

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

    死锁,进程和线程实验报告

    在实验中,我们模拟了银行家算法,这是一种避免死锁的经典策略,它通过预先分配和动态调整资源来确保系统的安全性。 接着,我们探讨了**进程**。进程是程序的一次执行过程,是操作系统资源分配的基本单位。每个进程...

    模拟线程 C#

    通过模拟线程,开发者可以更好地理解线程的工作原理,优化代码性能,同时避免潜在的问题,如竞态条件和死锁。通过持续学习和实践,开发者可以在C#中驾驭复杂的并发场景,为用户提供更流畅的体验。

    JVM---jstack分析Java线程CPU占用,线程死锁的解决

    在开发和运维过程中,有时会遇到Java应用的性能问题,如线程CPU占用过高或者线程死锁。这时,我们就需要用到JVM提供的工具,如`jstack`,来帮助诊断和解决问题。 `jstack` 是JDK自带的一个命令行工具,它能够打印出...

    C# 操作系统 模拟线程调度 源代码

    8. **调试与分析**:理解模拟线程调度的源代码可以帮助开发者更好地调试多线程问题,使用Visual Studio的调试工具,如线程窗口和性能分析器,可以更直观地查看线程的执行情况。 通过研究这个模拟项目,开发者不仅能...

    售票窗口模拟线程同步

    ### 售票窗口模拟线程同步:深入解析与实现 在多线程环境中,线程同步是一项关键的技术,用于确保多个线程访问共享资源时的正确性和一致性,避免资源竞争和数据不一致等问题。本文将通过一个具体的案例——售票窗口...

    多线程的销售模拟程序

    多线程 销售 死锁的有效防止 输出于文档

    Java编程之多线程死锁与线程间通信简单实现代码

    Java编程之多线程死锁与线程间通信简单实现代码 多线程编程是Java编程中的一种重要技术,它允许程序同时执行多个任务,以提高程序的效率和响应速度。但是,多线程编程也存在一些隐患,其中最常见的就是死锁和线程间...

    ThreadSwitch_滴水_threadswitch_线程切换_

    6. **死锁**:当两个或更多线程互相等待对方释放资源时,可能导致死锁。避免死锁的关键是遵循正确的资源获取顺序,以及合理使用超时和死锁检测机制。 7. **线程池**:为减少线程创建和销毁的开销,许多系统都使用...

    linux下 多线程模拟进程调度多线程模拟进程调度

    在Linux操作系统中,多线程模拟进程调度是一个深入理解操作系统内核和并发编程的重要主题。进程调度是操作系统核心的关键组成部分,负责决定哪个进程应该获得CPU的执行权,以及何时进行切换。而通过多线程模拟进程...

    线程模拟超市购物系统

    这样,我们可以进一步探讨Java线程的高级特性,如线程池的使用、守护线程、中断线程以及死锁的预防。 总的来说,"线程模拟超市购物系统"是一个很好的学习和实践多线程编程的案例。通过这个系统,我们可以深入理解...

    linux下多线程模拟实验

    在这个"Linux下多线程模拟实验"中,我们将深入探讨如何使用C语言在Linux环境下实现生产者-消费者问题,这是一个经典的线程同步问题。 生产者-消费者问题是多线程编程中的一个经典案例,主要用于演示如何通过共享...

    死锁避免——银行家算法的模拟实现 java源代码

    总的来说,通过银行家算法的模拟实现,我们可以深入理解死锁避免机制,学习如何在多线程环境中合理分配和管理资源,以及如何预防和解决潜在的死锁问题。这对于提升软件系统的可靠性具有重要意义。

Global site tag (gtag.js) - Google Analytics