线程模型--读写模型(1)

读写模型

读写模型是一个稍微复杂一些的模型。
一份共享资源允许多个读者同时读取。但是只要有一个写者在写这份共享资源,任何其他的读者和写者都不能访问这份共享资源。
读写模型实现起来,不仅需要信号量机制,还需要额外的读者计数和写者计数。
public static final Object signal = new Object();
public static int readers = 0;
public static int writers = 0;

// 读者代码
… read() {

  for(… ) { // 循环执行

  synchronized(signal){
      while( writers > 0 )
         signal.wait(); // 如果有人在写,那么就放弃执行,进入待召队列

      // 能够到达这里,说明没有人在写

      readers ++ ; // 增加一个读者计数,表示本线程在读取
  } // 这里出了synchronized范围,释放同步锁.以便其他线程读取.


     // 进行一些读取操作

  synchronized(signal){
      readers --; // 读取完成,减少一个读者计数,表示本线程不在读取
     
      signal.notifyAll(); // 通知待召队列里面的所有其他线程
  }
  }
}

// 写者代码
… write() {

  for(… ) { // 循环执行

  synchronized(signal){
      while( writers > 0 || readers > 0)
         signal.wait();// 如果有人在写或读,那么就放弃执行,进入待召队列

      // 能够到达这里,说明没有人在写,也没有人在读

      writers ++ ; // 增加一个写者计数,表示本线程在写

      // 进行一些写操作

      writers --; // 读取完成,减少一个读者计数,表示本线程不在写
     
      signal.notifyAll(); // 通知待召队列里面的所有其他线程
  }
  }
}

你可能感兴趣的:(线程)