写了一个java中线程同步的死锁问题,但是输出结果就是不对,劳烦前辈指点指点。源代码如下:
public class TestDeadLock implements Runnable{
public static int flag = 1;
static Object o1 = new Object();
static Object o2 = new Object();
public void run(){
System.out.println("flag=" + flag);
if(flag == 1){
synchronized(o1){
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
synchronized(o2){
System.out.print("1");
}
}
if(flag == 0){
synchronized(o2){
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
synchronized(o1){
System.out.print("0");
}
}
}
}
public static void main(String[] args) {
TestDeadLock testDeadLock1 = new TestDeadLock();
TestDeadLock testDeadLock2 = new TestDeadLock();
testDeadLock1.flag = 1;
testDeadLock2.flag = 0;
Thread t1 = new Thread(testDeadLock1);
Thread t2 = new Thread(testDeadLock2);
t1.start();
t2.start();
}
}
输的结果一直不是期待的那样子
public static int flag = 1;
改成
public int flag = 1; 试下
你期待的结果是什么样子呢?你的代码里面有三个线程,main所在的线程首先把flag设置成0了,所以,另外两个线程操作时都是走入了flag=0的分支了。
之所以没有发生死锁,是因为你的代码中暂用锁的线程Sleep时间是500,太短,而且都是flag=0的分支,锁顺序相同,线程1使用完成后就释放给线程2了,
所以根本感受不到停顿就释放锁了,进入相同分支不会发生死锁。
建议把sleep参数调大些如5000,那么看到打印出的00就是有先后顺序的。
如果你想看到发生死锁,就需要想办法让两个线程分别进入flag=0和flag=1的分支,那么就会发生锁顺序死锁的问题了。
参考:http://blog.csdn.net/wojiushiwo945you/article/details/45092501
testDeadLock1.flag = 1;
testDeadLock2.flag = 0;
这样最终flag=0
当然就只会执行
if(flag == 0){
synchronized(o2){
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
synchronized(o1){
System.out.print("0");
}
}
这个输出的话肯定是0啊,都走得是flag = 0 的分支
既然找到问题的所在了,我来吐个槽!。。
既然找到问题的所在了,我来吐个槽!。。