黑马程序员技术交流社区
标题:
我写的死锁,不报错但是运行输出空白( ⊙ o ⊙ )啊!
[打印本页]
作者:
吴刚
时间:
2013-5-17 23:10
标题:
我写的死锁,不报错但是运行输出空白( ⊙ o ⊙ )啊!
本帖最后由 吴刚 于 2013-5-28 23:21 编辑
<div class="blockcode"><blockquote>class R {
String name;
int age;
boolean f = false;
public synchronized void set(String name, int age) {
if (f) {
try {
this.wait();
} catch (Exception e) {
// TODO: handle exception
}
this.name = name;
this.age = age;
f = true;
this.notify();
}
}
public synchronized void out() {
if (!f) {
try {
this.wait();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(name+"..."+age);
f = false;
this.notify();
}
}
}
class Input implements Runnable {
private R r;
Input(R r){
this.r = r;
}
public void run(){
int x =0;
while (true) {
if(x == 0) {
r.set("张三",10000);
}else
r.set("wad", 1);
x = (1+x)%2;
}
}
}
class Output implements Runnable {
private R r;
public Output(R r) {
// TODO Auto-generated constructor stub
this.r = r;
}
public void run() {
while (true) {
r.out();
}
}
}
public class InOutTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
R r = new R();
new Thread(new Input(r)).start();
new Thread(new Output(r)).start();
}
}
复制代码
大家帮忙看看,并且我还有点疑问,就是boolean flag = false;那么使用 if(!flag)和if(flag == true)是一个意思吧,不知道大家常用的是那个....
作者:
librazeng
时间:
2013-5-18 00:55
你这不是死锁程序啊!
1.不报错但是运行输出空白( ⊙ o ⊙ )啊!
默认设置为false,set里 if (f),条件为假,所以线程new Thread(new Input(r)).start()不会进去set;
接着线程new Thread(new Output(r)).start()运行,进去直接this.wait();
这样一条线程睡着了,一条线程永远做着无聊的while循环(set不鸟)。
所以你就看到,没有输出但线程未停止。至于报错,我这里测试没出现!
2.boolean flag = false;那么使用 if(!flag)和if(flag == true)是一个意思吧
!flag的结果是true,flag==true的结果是false,所以不是一个意思。
贴一个我写的死锁程序(核心在于一个锁里持有另一个锁):
public class DeadLock2 implements Runnable{
/**
* @param args
*/
static boolean flag=true;
public void run(){
if(flag){
while(true){
synchronized(this.getClass()){
try{Thread.sleep(10);}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"把锁给我,我是你哥!");//-->0
synchronized(this){
try{Thread.sleep(10);}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"把锁给我,我是你妹!");
}
}
}
}else{
while(true){
synchronized(this){
System.out.println(Thread.currentThread().getName()+"把锁给我,我是你妹!");//-->1
synchronized(this.getClass()){
System.out.println(Thread.currentThread().getName()+"把锁给我,我是你哥!");
}
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
DeadLock2 d=new DeadLock2();
Thread a=new Thread(d);
Thread b=new Thread(d);
a.start();
try{Thread.sleep(10);}catch(InterruptedException e){}
flag=false;
b.start();
}
}
复制代码
作者:
吴刚
时间:
2013-5-18 20:06
额,谢谢楼上了
作者:
赵崇友
时间:
2013-5-18 21:07
一楼的哥们写的代码有意思。。。。
作者:
殇_心。
时间:
2013-5-18 21:13
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2