死锁的形成:
假如两个人在吃西餐,可只有一副餐具(小刀和叉子),且A先拿小刀,B先拿叉子,双方都没有再释放资源,一直僵持下去,所以就造成了死锁的局面,下面小编用代码解释:
先创造两个人的对象
public class Person1 implements Runnable {
//定义两个成员变量:刀、叉
private Object knife;
private Object fork;
public Person1(Object knife, Object fork) {
this.knife = knife;
this.fork = fork;
}
//当前线程执行run方法的顺序是:先获取knife对象,等待3s后获取fork对象
//由于对knife使用了synchronized关键字,表示在使用该knife对象期间,其他线程无权使用
//只有等待同步代码块执行结束后,其他线程才有机会获取knife对象
@Override
public void run() {
synchronized (knife){
System.out.println(Thread.currentThread().getName()+"获得了刀,3s后获得叉");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (fork){
System.out.println(Thread.currentThread().getName()+"获得了叉,可以吃饭了");
}
}
}
}
public class Person2 implements Runnable {
//定义两个成员变量:刀、叉
private Object knife;
private Object fork;
public Person2(Object knife, Object fork) {
this.knife = knife;
this.fork = fork;
}
//当前线程执行run方法的顺序是:先获取knife对象,等待3s后获取fork对象
//由于对knife使用了synchronized关键字,表示在使用该knife对象期间,其他线程无权使用
//只有等待同步代码块执行结束后,其他线程才有机会获取knife对象
@Override
public void run() {
synchronized (fork){
System.out.println(Thread.currentThread().getName()+"获得了叉,3s后获得刀");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (knife){
System.out.println(Thread.currentThread().getName()+"获得了刀,可以吃饭了");
}
}
}
}
main方法
public static void main(String[] args) {
Object knife = new Object();
Object fork = new Object();
Thread mt1 = new Thread(new Person1(knife, fork), "小明");
Thread mt2 = new Thread(new Person2(knife, fork), "小华");
mt1.start();
mt2.start();
}