全国
Java--教育路上

栏目导航

全国站 > Java > 多线程
需求

java死锁问题

摘要:java死锁问题,两个线程在运行时都在等待对方的锁,这样便造成了程序的停滞,这种现象称为死锁,java 死锁 问题。以下是我们为大家整理的,相信大家阅读完后肯定有了自己的选择吧。

标签:
发布时间:
2024-05-13 23:34
信息来源:
网络推荐
浏览次数:
759
java死锁问题

人:“你先给我刀叉,我再给你筷子!”

……

结果可想而知,两个人都吃不到饭。这个例子中的中国人和美国人相当于不同的线程,筷子

和刀叉就相当于锁。两个线程在运行时都在等待对方的锁,这样便造成了程序的停滞,这种

现象称为死锁。接下来通过中国人和美国人吃饭的案例来模拟死锁问题,如例 14-14 所示

例 14-14 Examplel4.java

class DeadLockThread implements Runnable {

static Object chopsticks = new Object(); // 定义 Object 类型的 chopsticks 锁对象

static Object knifeAndFork = new Object(); // 定义 Object 类型的 knifeAndFork 锁对象

private boolean flag; // 定义 boolean 类型的变量 flag

DeadLockThread(boolean flag) { // 定义有参的构造方法

this.flag = flag;

}

public void run() {

if (flag) {

while (true) {

synchronized (chopsticks) { // chopsticks 锁对象上的同步代码块

System.out.println(Thread.currentThread().getName()

+ "---if---chopsticks");

synchronized (knifeAndFork) { // knifeAndFork 锁对象上的同步代

码块

System.out.println(Thread.currentThread().getName()

+ "---if---knifeAndFork");

}

}

}

} else {

while (true) {

synchronized (knifeAndFork) { // knifeAndFork 锁对象上的同步代码块

System.out.println(Thread.currentThread().getName()

+ "---else---knifeAndFork");

synchronized (chopsticks) { // chopsticks 锁对象上的同步代码块

System.out.println(Thread.currentThread().getName()

+ "---else---chopsticks");

}

}

}

}

}

}

public class Example14 {

public static void main(String[] args) {

// 创建两个 DeadLockThread 对象

DeadLockThread d1 = new DeadLockThread(true);

DeadLockThread d2 = new DeadLockThread(false);

// 创建并开启两个线程

new Thread(d1, "Chinese").start(); // 创建开启线程 Chinese

new Thread(d2, "American").start(); // 创建开启线程 American

}

}

运行结果如图 14-18 所示

from shengerguan

例 14-14 中,创建了 Chinese 和 American 两个线程,分别执行 run()方法中 if 和 else

代码块中的同步代码块。Chinese 线程中拥有 chopticks 锁,只有获得 knifeAndFork 锁才能执

行完毕,而 American 线程拥有 knifeAndFork 锁,只有获得 chopsticks 锁才能执行完毕,两

个线程都需要对方所占用的锁,但是都无法释放自己所拥有的锁,于是这两个线程都处于了

挂起状态,从而造成了如图 14-18 所示的死锁。


上一篇:
java同步方法
下一篇:
java多线程通信
相关推荐
最近更新
学校免费发布信息关闭
如有图片请发邮件到:edu63@foxmail.com,审核后显示

 换一张

确认提交
完善补充本文信息关闭
非常感谢您帮助完善补充本文信息


 换一张

确认提交