解决方案 »

  1.   

    public class BufferLock
    {
    private int value;
    private boolean isEmpty = true;

    public synchronized void put(int i)
    {
    while (!isEmpty)
    {// 当value不空时,等待
    try
    {
    this.wait();
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    }
    this.value = i;
    System.out.println("Sender put" + i);
    isEmpty = false;
    notify();
    }

    public synchronized int get()
    {
    while (isEmpty)
    {// 当value为空时,等待
    try
    {
    this.wait();
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    }
    isEmpty = true;
    System.out.println("\t\t Receiver get: " + value);
    notify();
    return value;
    }

    public static void main(String[] args)
    {
    BufferLock buffer = new BufferLock();
    (new Sender2(buffer)).start();
    (new Receiver2(buffer)).start();
    }
    }class Sender2 extends Thread
    {
    private BufferLock buffer;

    public Sender2(BufferLock buffer)
    {
    this.buffer = buffer;
    }

    @Override
    public void run()
    {
    for (int i = 1; i < 6; i++)
    {
    buffer.put(i);
    try
    {
    sleep(1);
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    }
    }
    }class Receiver2 extends Thread
    {
    private BufferLock buffer;

    public Receiver2(BufferLock buffer)
    {
    this.buffer = buffer;
    }

    @Override
    public void run()
    {
    for (int i = 1; i < 6; i++)
    {
    buffer.get();
    try
    {
    sleep(1);
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    }
    }
    }
      

  2.   

    支持1楼。之所以出现楼主说的问题,是因为楼主将“打印动作”放到了两个线程中,而“打印动作”又不在同步块中。
    实际上对BufferLock的同步操作是没有问题的。