这是我的代码,
class Buffer1
{
private int value;
    private boolean isEmpty = true;
    synchronized void put(int i)
{
while(!isEmpty)
{
try
{
this.wait();
    }
catch(InterruptedException e)
{
System.out.println(e.getMessage());
} }
value = i;
isEmpty=false;
this.notify();
}
synchronized int get()
{

while(isEmpty)
{

try
{
this.wait();
}
catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
}
isEmpty = true;

this.notify();
return value;

}
}
class Sender1 extends Thread
{
private Buffer1 bf;
public Sender1(Buffer1 bf)
{
this.bf = bf;
}
public void run()
{

for(int i=1;i<6;i++)
{
bf.put(i);
System.out.println("Sender put:"+i);
}
}
public static void main(String args[])
{
Buffer1 bf=new Buffer1();
(new Sender1(bf)).start();
(new Receiver1(bf)).start();
// System.out.println("afdafd");

}
}
class Receiver1 extends Thread
{
private Buffer1 bf;
public Receiver1(Buffer1 bf)
{
this.bf = bf;
}
public void run()
{

for(int i=1;i<6;i++)

System.out.println("\t\t  Receiver get:"+bf.get());

}

我想实现这种同步效果,但是怎么改都行不通,谁能告诉我哪错了
Sender put:1
                  Receiver get:1
Sender put:2
                  Receiver get:2
Sender put:3
                  Receiver get:3
Sender put:4
                  Receiver get:4
Sender put:5
                  Receiver get:5

解决方案 »

  1.   

    稍微做了点修改:
    class Buffer1{
    private int value;
    private boolean isEmp=true;
    synchronized void put(int i){
    value = i;
    }
    synchronized int get(){
    return value;
    }
    public void setisEmpty(boolean b){
    isEmp=b;
    }
    public boolean isEmpty(){
    return isEmp;
    }
    }
    class Sender1 extends Thread{
    private Buffer1 bf;
    public Sender1(Buffer1 bf){
    this.bf = bf;
    }
    public void run(){
    for(int i=1;i<6;i++){
    while(!bf.isEmpty()){}
    bf.put(i);
    System.out.println("Sender put:"+i);
    bf.setisEmpty(false);
    }
    }
    public static void main(String args[]){
    Buffer1 bf=new Buffer1();
    (new Sender1(bf)).start();
    (new Receiver1(bf)).start();
    //System.out.println("afdafd");
    }
    }
    class Receiver1 extends Thread{
    private Buffer1 bf;
    public Receiver1(Buffer1 bf){
    this.bf = bf;
    }
    public void run(){
    for(int i=1;i<6;i++){
    while(bf.isEmpty()){}
    System.out.println("\t\t  Receiver get:"+bf.get());
    bf.setisEmpty(true);
    }
    }

      

  2.   

    class Buffer1
    {
    private int value;
    private boolean isEmpty = true;
    synchronized void put(int i)
    {
    while(!isEmpty)
    {
    try
    {
    this.wait();
    }
    catch(InterruptedException e)
    {
    System.out.println(e.getMessage());
    }
    }
    value = i;
    isEmpty=false;
    Thread.yield();//添加的代码
    this.notify();
    }
    synchronized int get()
    {
    while(isEmpty)
    {
    try
    {
    this.wait();
    }
    catch(InterruptedException e)
    {
    System.out.println(e.getMessage());
    }
    }
    isEmpty = true;
    Thread.yield();//添加的代码
    this.notify();
    return value;
    }
    }
    class Sender1 extends Thread
    {
    private Buffer1 bf;
    public Sender1(Buffer1 bf)
    {
    this.bf = bf;
    }
    public void run()
    {
    for(int i=1;i<6;i++)
    {
    bf.put(i);
    System.out.println("Sender put:"+i);
    }
    }
    public static void main(String args[])
    {
    Buffer1 bf=new Buffer1();
    (new Sender1(bf)).start();
    (new Receiver1(bf)).start();
    //System.out.println("afdafd");
    }
    }
    class Receiver1 extends Thread
    {
    private Buffer1 bf;
    public Receiver1(Buffer1 bf)
    {
    this.bf = bf;
    }
    public void run()
    {
    for(int i=1;i<6;i++)
    System.out.println("\t\t Receiver get:"+bf.get());
    }
      

  3.   

    也就是说,当你第一次put完毕并等待后,get取得了第一个元素,然后get挂起,但是接着问题就来了。如果put方法中执行到isEmpty=false;但还来不及输出时,时间片到了,此时isEmpty已经被设置为false了,然后执行get,取出了第二个元素。
    put和get同时访问了IsEmpty,尽管有一个已经被锁。
      

  4.   

    谢谢adongforever和clevercong,问题解决,我自己再想想.