读写锁

来源:互联网 发布:linux sys 编辑:程序博客网 时间:2024/04/30 08:14

本文摘自电子书

Data类

public class Data {
 private final char[] buffer;
 private final ReadWriteLock lock = new ReadWriteLock();
 public Data(int size){
  this.buffer = new char[size];
  for(int i = 0;i<buffer.length;i++){
   buffer[i] = '*';
  }
 }
 
 public char[] read() throws InterruptedException{
  lock.readLock();
  try{
   return doRead();
  }finally{
   lock.readUnlock();
  }
 }
 
 public void write(char c) throws InterruptedException{
  lock.writeLock();
  try{
   doWrite(c);
  }finally{
   lock.writeUnlock();
  }
 }
 
 private char[] doRead(){
  char[] newbuf = new char[buffer.length];
  for(int i = 0;i<buffer.length;i++){
   newbuf[i] = buffer[i];
  }
  slowly();
  return newbuf;
 }
 
 private void doWrite(char c){
  for(int i = 0;i<buffer.length;i++){
   buffer[i] = c;
   slowly();
  }
 }
 
 private void slowly(){
  try{
   Thread.sleep(50);
  }catch(InterruptedException e){
   
  }
 }
}


读线程

public class ReaderThread extends Thread{
 private final Data data;
 public ReaderThread(Data data){
  this.data = data;
 }
 
 public void run(){
  try{
   while(true){
    char[] readbuf = data.read();
    System.out.println(Thread.currentThread().getName()+String.valueOf(readbuf));
   }
  }catch(InterruptedException e){
   
  }
 }
}


写线程

public class WriterThread extends Thread{
 private static final Random random = new Random();
 private final Data data;
 private final String filler;
 private int index = 0;
 
 public WriterThread(Data data,String filler){
  this.data = data;
  this.filler = filler;
 }
 
 public void run(){
  try{
   while(true){
    char c = nextchar();
    data.write(c);
    Thread.sleep(random.nextInt(3000));
   }
  }catch(InterruptedException e){
   
  }
 }
 
 private char nextchar(){
  char c = filler.charAt(index);
  index++;
  if(index >= filler.length()){
   index = 0;
  }
  return c;
 }
}


读写锁

public final class ReadWriteLock {
 private int readingReaders = 0;//(A)...实际正在读取的线程数量
 private int waitingWriters = 0;//(B)...正在等待写入的线程数量
 private int writingWriters = 0;//(c)...实际正在写入的线程数量
 private boolean preferWriter = true;//写入优先的话,值为true
 
 public synchronized void readLock() throws InterruptedException{
  while(writingWriters>0 || (preferWriter && waitingWriters > 0)){
   wait();
  }
  
  readingReaders++;//(A)实际正在读取的线程数量加1
 }
 
 public synchronized void readUnlock(){
  readingReaders--; //(A)实际正在读取的线程数量减1
  preferWriter = true;
  notifyAll();
 }
 
 public synchronized void writeLock() throws InterruptedException{
  waitingWriters++;//(B)正在等待写入的线程数量加1
  try{
   while(readingReaders > 0 || writingWriters > 0){
    wait();
   }
  }finally{
   waitingWriters--;//(B)正在等待写入的线程数量减1
  }
  writingWriters++;//(C)实际正在写入的线程数量加1
 }
 
 public synchronized void writeUnlock(){
  writingWriters--;//(C)实际正在写入的线程数量减1
  preferWriter = false;
  notifyAll();
 }
}

测试类

public class MainReadWriteLock {
 public static void main(String[] args){
  Data data = new Data(10);
  new ReaderThread(data).start();
  new ReaderThread(data).start();
  new ReaderThread(data).start();
  new ReaderThread(data).start();
  new ReaderThread(data).start();
  new ReaderThread(data).start();
  new WriterThread(data,"ABCDEFGHIJKLMNOPQRSTUVWXYZ").start();
  new WriterThread(data,"abcdefghijklmnopqrstuvwxyz").start();
  
 }
}



0 0
原创粉丝点击