当前位置:编程学习 > JAVA >>

新手面对线程很困惑!

public class goods {
 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();

}

}
为什么 把get方法中if(bFull)就不对了,好像进入死锁了!
public  synchronized void get(){
 if(bFull)//这里
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
--------------------编程问答-------------------- bFull只是个标记,表示做了某个操作,另外一个线程就可以根据bFull判断是否做了这个操作。

这样以公用变量的方式,实现对一个资源的互斥操作。 --------------------编程问答-------------------- 那样改了逻辑就不对了。
假设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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,