> 文档中心 > 线程十六——死锁的问题

线程十六——死锁的问题

注意:两个对象 镜子和口红  注意看makeup方法 两种选择分别将拿到的每一种对象的锁进行加锁,不然会产生死锁,如果将chioc==0分支里的两种选择就放在一个同步锁里那么就会产生死锁。

死锁:: 多个线程互相抱着对方需要的资源,然后形成僵持,这样就形成了死锁

package com.yyf.ThreadStatus;import sun.rmi.runtime.NewThreadAction;import java.util.Map;// 死锁: 多个线程互相抱着 对象需要的资源,然后形成僵持,这样就形成了死锁public class DeadLock {    public static void main(String[] args) { MakeUp lang = new MakeUp (1, "大灰狼"); MakeUp yang = new MakeUp (0, "小白羊"); lang.start (); yang.start ();    }}class  Lipstick{}class Mirror{}// 化妆class  MakeUp extends Thread{    // 用static 保证每一份资源只有一个   static Lipstick lipstick=new Lipstick ();    static Mirror mirror=new Mirror();    // 使用化妆品的人选择了什么    int choice;    // 使用化妆品的人    String girlFriend;    public String getGirlFriend() { return girlFriend;    }    public MakeUp(int choice, String girlFriend){ this.choice=choice; this.girlFriend=girlFriend;    }    @Override    public void run() { try {     makeup (); } catch (InterruptedException e) {     e.printStackTrace (); }    }    void makeup() throws InterruptedException { if (choice==0){     synchronized (lipstick){  System.out.println (this.getGirlFriend ()+"拿到了口红的锁");  sleep (1000);     }     synchronized (mirror){  System.out.println (this.getGirlFriend ()+"拿到了镜子的锁");     } }else{     synchronized (mirror){  System.out.println (this.getGirlFriend ()+"拿到了镜子的锁");  sleep (2000);     }     synchronized (lipstick){  System.out.println (this.getGirlFriend ()+"拿到了口红的锁");     } }    }}

运行结果:   这里能看到是依次去拿自己的想要的对象,然后再释放锁,这样就不会互相持着对方想要的资源形成了僵持。

大灰狼拿到了镜子的锁
小白羊拿到了口红的锁
大灰狼拿到了口红的锁
小白羊拿到了镜子的锁