黑马程序员技术交流社区
标题:
死锁问题
[打印本页]
作者:
终结者
时间:
2013-11-21 13:53
标题:
死锁问题
本帖最后由 终结者 于 2013-11-21 19:32 编辑
public class ThreadTest{
public static void main(String[] args) {
new Thread(new Demo(true)).start();
new Thread(new Demo(false)).start();
}
}
class Demo implements Runnable{
private boolean flag;
public Demo(boolean flag){
this.flag=flag;
}
@Override
public void run() {
while(true){
if(flag){
synchronized(Demo.class){
System.out.println("Demo.class");
synchronized(this){
System.out.println("this");
}
}
}
else{
synchronized(this){
System.out.println("this");
synchronized(Demo.class){
System.out.println("Demo.class");
}
}
}
}
}
}
这个为什么没有发生死锁,求解原因
作者:
赵晓海
时间:
2013-11-21 16:54
本帖最后由 赵晓海 于 2013-11-21 20:40 编辑
如果你在同步快中循环输出些数据,运行结果往往是在某一时间段内(很短)只输出flag=true或者flag=false时的数据,可以看到两种情况是互斥的,即一个线程运行时,另一个线程肯定阻塞。
结论:当一个线程访问object的一个synchronized(this)同步代码块时, 其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
这就是为什么不能产生死锁的原因。
这是加了循环的代码:
public class ThreadTest2{
public static void main(String[] args) {
new Thread(new Demo(true)).start();
new Thread(new Demo(false)).start();
}
}
class Demo implements Runnable{
private boolean flag;
public Demo(boolean flag){
this.flag=flag;
}
@Override
public void run() {
while(true){
if(flag){
synchronized(Demo.class){
for(int x=0;x<=10;x++){
System.out.print(x+" ");
}System.out.println();
synchronized(this){
for(int x=10;x<=20;x++){
System.out.print(x+" ");
}System.out.println();
}
}
}
else{
synchronized(this){
for(int x=10;x>0;x--){
System.out.print('z');
}System.out.println();
synchronized(Demo.class){
for(int x=10;x>=0;x--){
System.out.print('Z');
}System.out.println();
}
}
}
} }
}
复制代码
作者:
终结者
时间:
2013-11-21 17:39
赵晓海 发表于 2013-11-21 16:54
如果你在同步快中循环输出些数据,运行结果往往是在某一时间段内(很短)只输出flag=true或者flag=false时 ...
还是没有说明白我的程序为什么没有死锁啊,你只是讲了实现死锁的原理,还有我不知道你为啥在里面要加上循环。跟我说的没有任何关系啊。我想问的是,我的程序没有死锁的原因出在哪里
作者:
FFF
时间:
2013-11-21 18:35
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2