package com.aflfte.syn;
/**
* 死锁的产生与解决方案
* 过多的使用同步可能会造成相互不释放资源
* 从而相互等待,一般发生于同步中持有多个对象的锁
*解决死锁:不要在锁内再套锁造成资源无法释放
* @author root
*
*/
public class DeadLock {
public static void main(String[] args) {
Markup g1=new Markup(1, "大丫");
Markup g2=new Markup(0, "二丫");
g1.start();
g2.start();
}
}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
//化妆
class Markup extends Thread{
static Lipstick stick=new Lipstick();
static Mirror mirror=new Mirror();
//选择
int choice;
//名字
String girl;
public Markup(int choice,String girl) {
super();
this.choice = choice;
this.girl=girl;
}
@Override
public void run() {
markup();
}
//相互持有对方的对象锁-->可能造成死锁
private void markup() {
if(choice==0) {
synchronized (stick) {//获得口红的锁
System.out.println(this.girl+"涂口红");
//1秒后想拥有镜子的锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*synchronized (mirror) {//获得镜子锁
System.out.println(this.girl+"照镜子");
}*/
}
synchronized (mirror) {//获得镜子锁
System.out.println(this.girl+"照镜子");
}
}else {
synchronized (mirror) {//获得镜子的锁
System.out.println(this.girl+"照镜子");
//2秒后想拥有镜子的锁
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*synchronized (stick) {//获得口红锁
System.out.println(this.girl+"涂口红");
}*/
}
synchronized (stick) {//获得镜子锁
System.out.println(this.girl+"涂口红");
}
}
}
}
« 协作模型:管程法
|
并发模拟示例»
|