1.代码
package com.gzz.deadlock.v1;
import static com.gzz.c99_tools.Sleeper.sleepMillis;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TestDeadLock {
public static void main(String[] args) {
Chopstick c1 = new Chopstick("1");
Chopstick c2 = new Chopstick("2");
Chopstick c3 = new Chopstick("3");
Chopstick c4 = new Chopstick("4");
Chopstick c5 = new Chopstick("5");
new Thread(() -> PhilosopherEat(c1, c2), "苏格拉底").start();
new Thread(() -> PhilosopherEat(c2, c3), "柏拉图").start();
new Thread(() -> PhilosopherEat(c3, c4), "亚里士多德").start();
new Thread(() -> PhilosopherEat(c4, c5), "赫拉克利特").start();
new Thread(() -> PhilosopherEat(c5, c1), "阿基米德").start();
}
static void PhilosopherEat(Chopstick left, Chopstick right) {
while (true) {
synchronized (left) {// 尝试获得左手筷子
synchronized (right) {// 尝试获得右手筷子
log.info("使用{}和{}eating...", left, right);
try {
TimeUnit.MILLISECONDS.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
@Data
@AllArgsConstructor
class Chopstick {
String name;
@Override
public String toString() {
return "筷子" + name;
}
}
2.命令jps, jstack

image.png

image.png
网友评论