IT Course

Technology Collection: Ruijin.R.Zhao

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
1,生产与消费关系,Writer 和 Reader
int reads = 0;
boolean writeLock = false;   //如果正在写入,则为true
Condition canWrite;
Condition canRead;

monitorEntry void beginRead()
{
      if(writeLock  || queue( canWrite ))  //如果有正在写的线程,或等待写的线程
      {
            wait(canRead);
      }
      ++reads;     //支持多个线程读
      signal(canRead); 
}
monitorEntry void endRead()
{
      --reads;
      if(reads == 0)  //如果没有线程需要读
      {
            signal(canWrite)
      }     
 }
-------------------------------------------------------------
monitorEntry void beginWrite()
{
      if(reads > 0 || writeLocal ) //如果有等待的读线程 或 存在有正在写的线程,则等待....
      {
            wait(canWrite);
      }
      writeLocal = true; //反之,则锁定所有的读和写(独占方式)
}
monitorEntry void endWrite()
{
      writeLocal  = false;  //释放锁
      if( queue(canRead) ) //如果有等待读的线程
      {
            signal(canRead);
      }
      else
      {
            signal(canWrite);

      }
}
-------------------------------------------------------------
2, 循环缓冲区
interface Buffer
{
      void set(int value);
      int get();
}
public class SynchronizedBuffer implements Buffer
{
      private int buffer[] = {-1,-1,-1};              //共享区
      private int occupiedBuffers = 0; //占用的共享区
      private int readLocation = 0;
      private int writeLocation = 0;
 
      public void set(int value)
      {
            sting name = Thread.CurrentThread.Name;
            while(occupiedBuffers = buffer.length) //如果已经填充满
            {
                  wait();
            }      
             buffer[writeLocation] = value;
             writeLocation = (writeLocation + 1) % buffer.length;
            ++occupiedBuffers ;
            notify();  //通知可以消费
      } 

      pblic int get()
      {
            sting name = Thread.CurrentThread.Name;
            while(occupiedBuffers = 0) //如果共享区是空
            {
                  wait(); //等待生产
            }     
            int readValue = buffers[readLocation];
            --occupiedBuffers ;
            readLocation = (readLocation + 1) % buffers.length;
      }
}
posted on 2009-07-28 22:15  tommy007  阅读(304)  评论(0)    收藏  举报