public class DeadLock implements Runnable { private boolean flag; static Object o1 = new Object(), o2 = new Object(); public void run() {
System.out.println(flag);
if (flag) {
synchronized (o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("AAA");
}
} } else {
synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("BBB");
}
} } } public static void main(String[] args) {
DeadLock aaa = new DeadLock();
DeadLock bbb = new DeadLock();
aaa.flag = true;
bbb.flag = false;
Thread thA = new Thread(aaa);
Thread thB = new Thread(bbb);
thA.start();
thB.start();
}
}为什么要执行Thread.sleep(500);不执行它不好用,为什么呢不明白,请高手讲解
楼主【skyearthsea】截止到2008-07-09 19:42:06的历史汇总数据(不包括此帖):
发帖的总数量:27 发帖的总分数:450 每贴平均分数:16
回帖的总数量:21 得分贴总数量:2 回帖的得分率:9%
结贴的总数量:26 结贴的总分数:440
无满意结贴数:4 无满意结贴分:60
未结的帖子数:1 未结的总分数:10
结贴的百分比:96.30 % 结分的百分比:97.78 %
无满意结贴率:15.38 % 无满意结分率:13.64 %
值得尊敬
Thread thB = new Thread(bbb);
thA.start();
thB.start();你的 thA.start();先执行,运行后结果都打印出来后才执行thB.start();
所以你的加锁是不影响的。
当你添加了Thread.sleep(500);thA.start();将对象锁住,等待时间结束,同时thB.start();也运行了也将也对象锁住
时间一到,两个线程同时运行时发现都在等待对方解锁。
System.out.println("AAA");
}
的时候,
线程B执行到synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}你设成Thread.sleep(50)或许也能造成死锁
thB在咬住o2不松口的情况下,还想要o1这样,两个线程都无休止的等待对方松口,从而都无法结束。咬住的操作是由synchronize后面的代码块({}中的语句序列)实现的,synchronize代码块的执行期间,线程将咬住(锁定)synchronize语句中制定的对象。sleep(500)保证了线程将咬住对象500毫秒以上。可以这样想象执行序列:1、a启动,咬住了o1后,暂停500毫秒;
2、b启动,咬住了o2,暂停500毫秒;
3、a完成了500毫秒暂停,尝试咬住o2,由于b没有松口(synchronize(o2)代码段没有退出),a等待b松口;
4、b的情形一样,等待a松口;于是,两个线程无限等待下去,程序无法退出了。
sleep就是 给B机会了
否则可能在执行线程A的时间片的时候,它就把两个对象都给拿到了,那怎么能形成死锁?