您的位置:首页 > 编程语言 > Java开发

Java基础:死锁示例

2015-12-19 21:02 543 查看
java多线程编程中,如果线程锁使用不当,就会产生死锁,以下是一个简单的死锁示例。

public class DeadRunnable implements Runnable{
Object locka=new Object();
Object lockb=new Object();
boolean flag;

public DeadRunnable(boolean flag) {
super();
this.flag = flag;
}

public void setFlag(boolean flag) {
this.flag = flag;
}

//嵌套锁,会产生死锁问题
@Override
public void run() {
if(flag){
while(true){
synchronized(locka){
System.out.println(Thread.currentThread().getName()+"....if locka");
synchronized(lockb){
System.out.println(Thread.currentThread().getName()+"....if lockb");
}
}
}
}else{
while(true){
synchronized(lockb){
System.out.println(Thread.currentThread().getName()+"....else lockb");
synchronized(locka){
System.out.println(Thread.currentThread().getName()+"....else locka");
}
}
}
}
}

}


import org.junit.Test;

public class DeadLock {

@Test
public void testDeadLock(){
DeadRunnable d=new DeadRunnable(true);
Thread t1=new Thread(d);
Thread t2=new Thread(d);
t1.start();
//主线程睡眠10毫秒,用来设置DeadRunnable的flag值
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
d.setFlag(false);
t2.start();
}
}


死锁分析:线程1占有locka,请求loackb,且在获得lockb前不会释放locka;线程2占有lockb,请求locka,且在获得locka前不会释放lockb。这就造成互相请求对方资源的僵局,任何一个线程都无法向前推进,进而产生锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: