用Java实现的第二类读者写者问题


用Java实现的第二类读者写者问题:

  1. //--Semaphore.java</PRE><PRE class=java name="code">package rw;   
  2.   
  3. public class Semaphore {  
  4.     private int value;//记录希望访问临界资源的线程的计数器个数   
  5.       
  6.     public Semaphore(int i)  
  7.     {  
  8.         this.value=i;  
  9.     }  
  10.       
  11.     public synchronized void P()  
  12.     {  
  13.         value--;  
  14.         if(value<0)  
  15.             try {  
  16.                 wait();  
  17.             } catch (InterruptedException e) {  
  18.                 e.printStackTrace();  
  19.                 Thread.currentThread().interrupt();  
  20.             }  
  21.     }  
  22.   
  23.     public synchronized void V()  
  24.     {  
  25.         value++;  
  26.         if(value<=0)  
  27.         {  
  28.             notifyAll();  
  29.         }  
  30.     }  
  31. }</PRE><BR>  
  32. <PRE class=java name="code">//------------------------------文件2  ReaderWriter.java------------------------------------------------   
  33. package rw;  
  34.   
  35. import java.io.FileNotFoundException;  
  36. import java.io.PrintStream;  
  37.   
  38. public class ReaderWriter extends Thread{  
  39.   
  40.     String msg;  
  41.     int NO;  
  42.     final int N=100;  
  43.     static public int num=0;  
  44.     static public int readers=0;  
  45.     static public int writers=0;  
  46.     final static public String base="Last Writer:";  
  47.     static public String resource=base+"0";  
  48.     static Semaphore mutexr=new Semaphore(1);  
  49.     static Semaphore mutexw=new Semaphore(1);  
  50.       
  51.     static Semaphore mutex=new Semaphore(1);  
  52.       
  53.     static Semaphore mutexWrite=new Semaphore(1);  
  54.       
  55.     public ReaderWriter()  
  56.     {  
  57.         NO=num++;  
  58.         if(NO%N!=1)  
  59.             msg="I am reader @"+NO;  
  60.         else   
  61.             msg="I am writer @"+NO;  
  62.     }  
  63.       
  64.     public void read()  
  65.     {  
  66.         if(writers!=0)//如果有写者,阻塞,并且后续的读者不许进来   
  67.             mutex.P();  
  68.         mutexr.P();  
  69.         readers++;  
  70.         if(readers==1)//保证当读的时候,对写互斥,写者等待   
  71.             mutexWrite.P();  
  72.         mutexr.V();  
  73.           
  74.         //.............................................读开始...   
  75.         System.out.println("      "+NO+" is reading, resource=" +resource);  
  76.         //.............................................读结束...   
  77.           
  78.         mutexr.P();  
  79.         readers--;  
  80.         if(readers==0)  
  81.             mutexWrite.V();  
  82.         mutexr.V();  
  83.         if(writers!=0)//如果有写者,阻塞,并且后续的读者不许进来   
  84.             mutex.V();  
  85.     }  
  86.       
  87.     public void write()  
  88.     {  
  89.           
  90.         mutexw.P();  
  91.         writers++;  
  92.         if(writers==1)  
  93.             mutex.P();  
  94.         mutexw.V();  
  95.           
  96.         //.....................................................写开始   
  97.         mutexWrite.P();  
  98.         resource="base"+NO;  
  99.         System.out.println(NO+" IS WRITING, resource=" +resource);  
  100.         mutexWrite.V();  
  101.         //.....................................................写结束   
  102.           
  103.         mutexw.P();  
  104.         writers--;  
  105.         if(writers==0)  
  106.             mutex.V();  
  107.         mutexw.V();  
  108.     }  
  109.       
  110.     public void run()  
  111.     {  
  112.         int n=1000;  
  113.         while(n-->0)  
  114.         {  
  115.             if(NO%N!=1)  
  116.             {/* 
  117.                 try { 
  118.                     Thread.sleep(1); 
  119.                 } catch (InterruptedException e) { 
  120.                     // TODO Auto-generated catch block 
  121.                     e.printStackTrace(); 
  122.                 } 
  123.                 */  
  124.                 read();  
  125.             }  
  126.             else   
  127.             {  
  128.                 write();  
  129.                 /* 
  130.                 try { 
  131.                     Thread.sleep(100); 
  132.                 } catch (InterruptedException e) { 
  133.                     // TODO Auto-generated catch block 
  134.                     e.printStackTrace(); 
  135.                 } 
  136.                 */  
  137.             }  
  138.         }  
  139.     }  
  140.       
  141.     public static void main(String args[])  
  142.     {  
  143.         PrintStream ps;  
  144.         try {  
  145.             ps = new PrintStream("D:\\readerWriter.txt");  
  146.             System.setOut(ps);  
  147.         } catch (FileNotFoundException e) {  
  148.             e.printStackTrace();  
  149.         }  
  150.         for(int i=0;i<1000;i++)  
  151.         {  
  152.             new ReaderWriter().start();  
  153.         }  
  154.     }  
  155. }

相关内容