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);不执行它不好用,为什么呢不明白,请高手讲解
解决方案 »
- 在不修改文件内容的基础上添加内容 内容是分开的 在其中一个内容段后加 该怎么写
- Java 多线程技术,到底是怎么一回事啊?怎样实现呢?另外,如何为按钮增添事件呢?谢谢了
- java压栈出栈?急急急急
- 能不能用JAVA代码实现登陆框自动填写并登陆?
- 一道关于string的题目,想不出来,大家有什么简便的方法
- 大家好!我有个路径问题请教大家
- 100分求!!Java如何调用执行C源码???
- 问题很菜,不过,还是想请各位大侠多多指教关于学习java的途径!!!
- 有人用Visual J++,那肯定解决了这个兼容问题了吧,看看我怎么解决不了啊???(进来看看啊)
- java中添加图片的问题
- 怎么用url写一个下载图片
- 如何实现在网页上 进行邮件附件下载?
楼主【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的时间片的时候,它就把两个对象都给拿到了,那怎么能形成死锁?