多线程问题,生产者和消费者问题BUFFER里面只有一个位置,而多个生产者同时都看到这个位置,如何处理这个临界状态,而不出错呢,不用同步的方法。谢谢。

解决方案 »

  1.   

    首先,buffer里必须实现如果位置已满还有生产者要添加产品时抛出异常。
    生产者伪代码:
    public class Productor{
      public Product push(Product p){ 
            while(true){
              try{
              buffer.add(p);
              }catch(由于buffer.add不能添加进去而抛出的异常){
                try{
                 Thread.sleep(Math.random()*1000);
                }catch(Exception e){
                }
              }
            }
        //return XXX;
      }
    }
      

  2.   

    信号量,p/v操作。
    lz既然做这道题应该学了操作系统课了吧。
      

  3.   

    可以用 信号量控制。
    1.5以上版本如果要实现复杂操作,
    可以单独写一个类,继承Thread或实现Runnable接口,
    把BUFFER作为参数传进去。
    则生成的线程共享一个 BUFFER 对象,用信号量控制,一个时间只有一个线程可以push()。import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.Semaphore;public class TestSemaphore {
    public TestSemaphore(String name) {
    } public static void main(String[] args) {
    final BUFFER buffer = new BUFFER();

    for (int i = 0; i < 10; i++) {
    new Thread(new Runnable(){ public void run() {
    buffer.push(new Object());
    }

    }).start();
    }
    }
    }class BUFFER
    {
    private List buffer = new ArrayList();
    private Semaphore semaphore = new Semaphore(1);//Semaphore对象,并规定Semaphore可以发出的许可是1个

    public void push(Object o)
    {
    try {
    semaphore.acquire();//同时只能有1个线程能得到许可并向下执行,剩下的线程执行到这里会阻塞直到有新的许可。
    System.out.println(o + "   acquire.");
    buffer.add(o);

    Thread.sleep(5000);
    buffer.remove(o);
    //可添加复杂处理
    semaphore.release();//执行完后线程释放掉许可,让在acquire()处阻塞的线程可以得到许可向下执行。
    System.out.println(o + "   release.");
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }