黑马程序员技术交流社区
标题:
此程序为什么构不成死锁?
[打印本页]
作者:
无道
时间:
2013-12-14 18:56
标题:
此程序为什么构不成死锁?
//死锁同代码中同步函数
package thread;
class LockTwo implements Runnable{
public static boolean falg;
private static int ticket = 100;
LockTwo(boolean falg) {
this.falg = falg;
}
public void run(){
if(falg){
while(true)
synchronized(LockTwo.class){
show();
}
}
else{
while(true)
show();
}
}
private synchronized void show(){
synchronized(LockTwo.class){
System.out.println(Thread.currentThread().getName()+"----------------"+ticket--);
}
}
}
public class DeathLockTwo{
public static void main(String[] args){
LockTwo lock = new LockTwo(false);
new Thread(lock).start();
lock.falg = true;
new Thread(lock).start();
}
}
复制代码
此程序为什么构不成死锁呢?请高手解答。谢谢。
作者:
王雨神
时间:
2013-12-14 21:38
厕所A里有张三,这个时候李四要去厕所A的话,就必须等张三出来
而李四去厕所B跟张三无关,要看厕所B里是谁持有所有权,这是我对锁的理解。
死锁就是A锁持有B锁,B锁持有A锁,两个相持不下,谁也释放布料锁,谁也访问不了锁。你写的没错。
不过你这个就一个对象啊,lock.falg = true;
还是就一个lock对象也就是说除了主线程就一个线程啊哥们,你在建个线程就成死锁了。。。
作者:
Lillian
时间:
2013-12-14 22:46
你这个代码是因为第一个子线程还没有起来,主线程已经将flag设为true了。
你可以再if和else里面分别加一句打印试试看,会输出两个if子句里的值。
想要形成死锁可以在main函数里lock.flag=true之前加一句sleep。
public class TestDeadlockTwo{
public static void main(String[] args){
LockTwo lock = new LockTwo(false);
new Thread(lock).start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
lock.falg = true;
new Thread(lock).start();
}
}
复制代码
作者:
无道
时间:
2013-12-15 22:04
Lillian 发表于 2013-12-14 22:46
你这个代码是因为第一个子线程还没有起来,主线程已经将flag设为true了。
你可以再if和else里面分别加一句 ...
非常感谢您的回答。问题果然是出要此处。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2