教育路上
摘要:java死锁问题,两个线程在运行时都在等待对方的锁,这样便造成了程序的停滞,这种现象称为死锁,java 死锁 问题。以下是我们为大家整理的,相信大家阅读完后肯定有了自己的选择吧。
2022-05-19 13:55网络推荐
人:“你先给我刀叉,我再给你筷子!”
……
结果可想而知,两个人都吃不到饭。这个例子中的中国人和美国人相当于不同的线程,筷子
和刀叉就相当于锁。两个线程在运行时都在等待对方的锁,这样便造成了程序的停滞,这种
现象称为死锁。接下来通过中国人和美国人吃饭的案例来模拟死锁问题,如例 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 所示
例 14-14 中,创建了 Chinese 和 American 两个线程,分别执行 run()方法中 if 和 else
代码块中的同步代码块。Chinese 线程中拥有 chopticks 锁,只有获得 knifeAndFork 锁才能执
行完毕,而 American 线程拥有 knifeAndFork 锁,只有获得 chopsticks 锁才能执行完毕,两
个线程都需要对方所占用的锁,但是都无法释放自己所拥有的锁,于是这两个线程都处于了
挂起状态,从而造成了如图 14-18 所示的死锁。
访客的评论 2024/04/27 10:23
文中描述的是准确的吗,如何报名!