死锁是什么?
Java中死锁是多个线程互相持有对方需求的锁却又不肯释放掉自己锁持有的锁。所造成的程序暂停。
就如同两个人分别拿枪指着对方的脑袋,并要求对方先放下枪,自己才肯放下枪,如果没有一个人做出让步,则僵持不下的状态会一直持续下去。
死锁Demo
package com.design;
public class DeadLockDemo extends Thread {
public static void main(String[] args) {
Children ming = new Children("小明");
Children hong = new Children("小红");
new Thread(
()->{
synchronized (Children.bread)
{
ming.eat();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (Children.milk)
{
ming.drink();
}
}
}
).start();
new Thread(
()->{
synchronized (Children.milk)
{
hong.eat();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (Children.bread)
{
hong.drink();
}
}
}
).start();
}
}
class Children {
static String milk = "牛奶";
static String bread = "面包";
String name;
public Children(String name) {
this.name = name;
}
void eat() {
System.out.println(name + "正在吃" + bread);
}
void drink() {
System.out.println(name + "正在喝" + milk);
}
}
在上面的例子中,我们声明了两个静态变量milk和bread,以保证变量的唯一性。
我们小明先取得面包锁进行吃,让小红先取得牛奶锁进行喝。然后让两个线程分别休眠1秒钟,两线程休眠过后。小明要获取牛奶锁才能完成吃释放掉面包锁,而小红要获取面包锁才能完成喝释放掉牛奶锁。二者互相等待,谁都不肯释放掉当前锁。