ReeantrantLock and Condition variable



你好:)我正在学习Java中的重入锁和条件变量。我碰巧看到了这个教程。在本教程中,作者提供了一个使用ReentrantLock的生产者-消费者示例:

public class CondDemo
{
   public static void main(String[] args)
   {
      Shared s = new Shared();
      new Producer(s).start();
      new Consumer(s).start();
   }
}
class Shared
{
   private volatile char c;
   private volatile boolean available;
   private final Lock lock;
   private final Condition condition;
   Shared()
   {
      c = 'u0000';
      available = false;
      lock = new ReentrantLock();
      condition = lock.newCondition();
   }
   Lock getLock()
   {
      return lock;
   }
   char getSharedChar()
   {
      lock.lock();
      try
      {
         while (!available) {
            try
            {
               condition.await();
            }
            catch (InterruptedException ie)
            {
               ie.printStackTrace();
            }
         }
         available = false;
         condition.signal();
      }
      finally
      {
         lock.unlock();
         return c;
      }
   }
   void setSharedChar(char c)
   {
      lock.lock();
      try
      {
         while (available) {
            try
            {
               condition.await();
            }
            catch (InterruptedException ie)
            {
               ie.printStackTrace();
            }
         }
         this.c = c;
         available = true;
         condition.signal();
      }
      finally
      {
         lock.unlock();
      }
   }
}
class Producer extends Thread
{
   private final Lock l;
   private final Shared s;
   Producer(Shared s)
   {
      this.s = s;
      l = s.getLock();
   }
   @Override
   public void run()
   {
      for (char ch = 'A'; ch <= 'Z'; ch++)
      {
         l.lock();
         s.setSharedChar(ch);
         System.out.println(ch + " produced by producer.");
         l.unlock();
      }
   }
}
class Consumer extends Thread
{
   private final Lock l;
   private final Shared s;
   Consumer(Shared s)
   {
      this.s = s;
      l = s.getLock();
   }
   @Override
   public void run()
   {
      char ch;
      do
      {
         l.lock();
         ch = s.getSharedChar();
         System.out.println(ch + " consumed by consumer.");
         l.unlock();
      }
      while (ch != 'Z');
   }
}

ProducerConsumer中的l.lock()l.unlock()方法是否不必要?我注意到我们已经在Shared对象的getSharedChar()setSharedChar()方法中应用了lock/unlock。或者这是使用条件变量的建议模式?

这是不是一个不好的做法,你能提供一个链接更好的例子吗?

谢谢:)

这既不是必要的,也不是模式。

IMHO这是一个丑陋的冗余锁,用于干净的输出。我的意思是丑陋的,因为没有尝试-最后确保第一层解锁,它暴露了Shared API的内部状态。

要深入学习Java并发性,可以使用SynchronousQueue或exchange

获得相同的结果

最新更新