教育路上

全国站>Java>多线程>java死锁问题
发布需求
填写需求信息关闭
我们会根据您的需求匹配

姓      名:

意向城市:

留      言:

手机号码:

验  证  码:  换一张

确认提交

java死锁问题

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

2022-05-19 13:55网络推荐

发布时间:
2022-05-19 13:55
信息来源:
网络推荐
浏览次数:
321
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多线程通信
标签:
网友评论
发布评论

访客的评论 2022/12/01 01:32

文中描述的是准确的吗,如何报名!

相关推荐
我也来发表评价关闭
我对该内容的评价:
0
评价500
验证码: 看不清 换一张
提交 (匿名发布,无须担心别人知道您的身份)