classLipstick {
}classMirror {
}class Makeup extendsThread {intflag;
String girl;static Lipstick lipstick = newLipstick();static Mirror mirror = newMirror();
@Overridepublic voidrun() {//TODO Auto-generated method stub
doMakeup();
}voiddoMakeup() {if (flag == 0) {synchronized(lipstick) {
System.out.println(girl+ "拿着口红!");try{
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}synchronized(mirror) {
System.out.println(girl+ "拿着镜子!");
}
}
}else{synchronized(mirror) {
System.out.println(girl+ "拿着镜子!");try{
Thread.sleep(2000);
}catch(InterruptedException e) {
e.printStackTrace();
}synchronized(lipstick) {
System.out.println(girl+ "拿着口红!");
}
}
}
}
}classTestDeadLock {public static voidmain(String[] args) {
Makeup m1= newMakeup();
m1.girl= "大丫";
m1.flag= 0;
Makeup m2= newMakeup();
m2.girl= "小丫";
m2.flag= 1;
m1.start();
m2.start();
}//如何解决死锁问题://1. 往往是程序逻辑的问题。需要修改程序逻辑。//2. 尽量不要同时持有两个对象锁。如修改成如下:
voiddoMakeup() {if (flag == 0) {synchronized(lipstick) {
System.out.println(girl+ "拿着口红!");try{
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}synchronized(mirror) {
System.out.println(girl+ "拿着镜子!");
}
}else{synchronized(mirror) {
System.out.println(girl+ "拿着镜子!");try{
Thread.sleep(2000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}synchronized(lipstick) {
System.out.println(girl+ "拿着口红!");
}
}
}
}/** 同步是一种解决问题的思路,结合前面卫生间的示例,互斥方式解决多线程的原理是, 当一个人进入到卫生间内部时,别的人只能在外部时刻等待,
* 这样就相当于别的人虽然没有事情做,但是还是要占用别的人的时间, 浪费系统的执行资源。而同步解决问题的原理是,如果一个人进入到卫生间内部时,
* 则别的人可以去睡觉,不占用系统资源,而当这个人从卫生间出来以后, 把这个睡觉的人叫醒[就是wait,notify的应用。],则它就可以使用临界资源了。
* 所以使用同步的思路解决多线程问题更 加有效,更加节约系统的资源。*/