线程死锁场景模拟,抢筷子
public class DeadlockTest {
public static void main(String[] args) {
Kuaizi k1 = new Kuaizi(1);
Kuaizi k2 = new Kuaizi(2);
Thread t1 = new Thread(k1);
Thread t2 = new Thread(k2);
t1.start();
t2.start();
}
}
class Kuaizi implements Runnable {
private static String s1 = "左筷子";
private static String s2 = "右筷子";
private int who;
public Kuaizi(int i) {
this.who = i;
}
@Override
public void run() {
if(who == 1) {
synchronized(s1) {
System.out.println("小明拿到了左筷子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s2) {
System.out.println("小明拿到了右筷子");
System.out.println("小明可以吃饭了");
}
}
}else if(who == 2){
synchronized(s2) {
System.out.println("小红拿到了右筷子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s1) {
System.out.println("小红拿到了左筷子");
System.out.println("小红可以吃饭了");
}
}
}
}
}
运行结果:
小明拿到了左筷子
小红拿到了右筷子
-----------------------------------------------
你俩天长地久
A锁定了甲资源,B锁定了乙资源。A想锁定乙资源再释放甲资源,B想锁定甲资源再释放乙资源;AB永远僵持。一般发生在synchronized(引用) {修饰块}