在这里写一个线程死锁的例子:
郭老板和黄老板都想喝啤酒,喝啤酒一共需要两个物件,杯子和啤酒,这里分别对杯子和啤酒都上锁,例子中郭老板和黄老板都需要同时拿到两个物件后才能喝到酒。这里为了防止线程运行速度过快郭老板或黄老板喝酒的动作一下执行而产生不了死锁,在他们拿到其中一个物件后设置了线程休眠,这样就可以模拟发生死锁。
产生死锁的条件:两个线程都同时需要对方的资源,并且未完成前都不释放当前占有的资源。
package test.thread2;
public class DeadLock {
public static void main(String[] args) {
Drink d1 = new Drink(0,"郭老板");
Drink d2 = new Drink(2,"黄老板");
d1.start();
d2.start();
}
}
class Beer{
}
class Cup{
}
class Drink extends Thread{
private static Beer beer = new Beer();
private static Cup cup = new Cup();;
private int choice;
private String name;
public Drink(int choice,String name) {
this.choice = choice;
this.name = name;
}
public void run() {
try {
drink(choice, name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void drink(int choice,String name) throws InterruptedException {
// TODO Auto-generated method stub
if(choice==0) {
synchronized (beer) {//需要同时获得杯子和啤酒
System.out.println(name+"拿到了啤酒");
Thread.sleep(1000);
synchronized (cup) {
System.out.println(name+"拿到了杯子");
}
}
System.out.println(name+"端起杯子喝啤酒");
}else {//需要同时获得杯子和啤酒
synchronized (cup) {
System.out.println(name+"拿到了杯子");
Thread.sleep(1000);
synchronized (beer) {
System.out.println(name+"拿到了啤酒");
}
}
System.out.println(name+" 端起杯子倒啤酒");
}
}
}
黄老板和郭老板只能拿到所需资源的一部分,并且不喝到酒就不释放资源。
产生死锁的条件:两个线程都同时需要对方的资源,并且未完成前都不释放当前占有的资源。
package test.thread2;
public class DeadLock {
public static void main(String[] args) {
Drink d1 = new Drink(0,"郭老板");
Drink d2 = new Drink(2,"黄老板");
d1.start();
d2.start();
}
}
class Beer{
}
class Cup{
}
class Drink extends Thread{
private static Beer beer = new Beer();
private static Cup cup = new Cup();;
private int choice;
private String name;
public Drink(int choice,String name) {
this.choice = choice;
this.name = name;
}
public void run() {
try {
drink(choice, name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void drink(int choice,String name) throws InterruptedException {
// TODO Auto-generated method stub
if(choice==0) {
synchronized (beer) {//需要同时获得杯子和啤酒
System.out.println(name+"拿到了啤酒");
Thread.sleep(1000);
}
synchronized (cup) {
System.out.println(name+"拿到了杯子");
}
System.out.println(name+"端起杯子喝啤酒");
}else {//需要同时获得杯子和啤酒
synchronized (cup) {
System.out.println(name+"拿到了杯子");
Thread.sleep(1000);
synchronized (beer) {
System.out.println(name+"拿到了啤酒");
}
}
System.out.println(name+" 端起杯子倒啤酒");
}
}
}
解决死锁的办法:只有其中一个人不需要同时占有两个资源,死锁就不发生,两个人最后都能喝到酒。



