线程十六——死锁的问题
注意:两个对象 镜子和口红 注意看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 ()+"拿到了口红的锁"); } } }}
运行结果: 这里能看到是依次去拿自己的想要的对象,然后再释放锁,这样就不会互相持着对方想要的资源形成了僵持。
大灰狼拿到了镜子的锁
小白羊拿到了口红的锁
大灰狼拿到了口红的锁
小白羊拿到了镜子的锁