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