死锁:
多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致两个或者多个
线程都在等待对方释放资源,都停止执行的情况。某一同步块同时 拥有两个以上对象的锁 时,就可能发生
死锁的问题。
举例:哲学家就餐问题:每人面前一碗面,但没碗面之间都只有一把刀或叉,哲学家需要 到和叉子才能吃面,
当哲学家分拿起一把刀或叉,不肯放下,就造成死锁。
化妆问题,丫丫和小丫,一人照镜子,一人涂口红,但同时两人都想 照镜子,又涂口红,就会造成
死锁
package com.wxh.DeadSyn;
public class DeadsynTest {
public static void main(String[] args) {
makeup ma =new makeup("yaya",0);
makeup ma1 =new makeup("lili",1);
ma.start();
ma1.start();
}
}
//jingzhi
class mirror{
}
// kouhong
class lipstick{
}
class makeup extends Thread{
static mirror m = new mirror();
static lipstick l = new lipstick();
String girl;
int choose;
public makeup(String girl, int choose) {
this.girl = girl;
this.choose = choose;
}
public void run(){
// test(); //死锁的产生
test1(); //死锁的解决
}
private void test1() {
if(choose ==0){
synchronized(m){ //得到镜子锁
System.out.println(this.girl+"在照镜子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(l){ //用完镜子锁,释放镜子锁,得到口红锁,
System.out.println(this.girl+"涂口红");
}
}else{
synchronized(l){
System.out.println(this.girl+"在涂口红");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(m){ //用完口红锁,释放锁,得到镜子锁,两个没有同时占有一个锁 不释放
System.out.println(this.girl+"照镜子");
}
}
}
private void test() {
if(choose ==0){
synchronized(m){ //得到镜子锁
System.out.println(this.girl+"在照镜子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(l){ //得到镜子锁的同时,还想得到口红锁,造成锁中锁,而另一人也同样想法,造成死锁
System.out.println(this.girl+"涂口红");
}
}
}else{
synchronized(l){
System.out.println(this.girl+"在涂口红");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(m){
System.out.println(this.girl+"照镜子");
}
}
}
}
}