新手面对线程很困惑!
public class goods {为什么 把get方法中if(bFull)就不对了,好像进入死锁了!
String name="王芳1",sex="女1";
boolean bFull=false;
public synchronized void put(String name,String sex){
if(bFull)
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.name=name;
try{
Thread.sleep(10);
}
catch(Exception ex){ex.getMessage();}
this.sex=sex;
bFull=true;
notify();
}
public synchronized void get(){
if(!bFull)//问题出
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println(Thread.currentThread().getName()+"--"+name+"-->"+sex);
bFull=false;
notify();
}
}
public class thead1 {
public static void main(String[]args){
goods g=new goods();
new Thread(new produce(g)).start();
new Thread(new consumer(g)).start();
}
}
public synchronized void get(){--------------------编程问答-------------------- bFull只是个标记,表示做了某个操作,另外一个线程就可以根据bFull判断是否做了这个操作。
if(bFull)//这里
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这样以公用变量的方式,实现对一个资源的互斥操作。 --------------------编程问答-------------------- 那样改了逻辑就不对了。
假设produce线程先运行,初始bFull 是 false. 执行下面的语句后
this.name=name;
try{
Thread.sleep(10);
}
catch(Exception ex){ex.getMessage();}
this.sex=sex;
bFull=true;
notify();
bFull 为 true.
接下来,可能还是这个线程获得执行权(线程的调度的随机性),也可能消费线程获得执行权,假设是后一种情况,执行 if(bFull) 为真,执行下面的语句后
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这个消费线程让出同步对象锁,进入等待状态了。这时,生产线程一定会获得运行的权力了,当执行if(bFull)时,也为真,执行下面的语句后
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这个线程也进入的等待状态了,这样两个线程都在等待状态,没有一个会执行notify(),就这样永远等下去了。
其他情况最后都会是这样的状态。 --------------------编程问答-------------------- 这个还不好理解么???一个写操作一个读操作,两个操作显然是互斥的,而且是先读后写,如果都是if(bFull),结果两个线程都进入了wait()方法,那么它们都在等待对方执行notify(),就成了死锁了。。。。。。
补充:Java , Java SE