Java 多线性读者写者问题


Java 多线性读者写者问题

  1. package namespace;  
  2. class Man   
  3. {  
  4.     String name;  
  5.     String sex;  
  6.     boolean flag=false;//  定义一个开关变量,用来进行读或写的操作   
  7. }  
  8. class Input implements Runnable  
  9. {  
  10.     private Man man;  
  11.     private static  int num=1;//用于控制两次写进去的值不一样    
  12.       
  13.     public Input(Man m)  
  14.     {  
  15.         this.man=m;  
  16.     }  
  17.     public void run()  
  18.     {  
  19.         while(true)  
  20.             {  
  21.                synchronized(man) {  
  22.                    if(man.flag)//如果flag=true的话,就代表已经写进去值了,所以就要等待   
  23.                        try { man.wait();}catch(Exception e) {}  
  24.                          
  25.                    if(num==1)//等待被唤醒之后,下面就要对其进行写的操作了   
  26.                    {  
  27.                         man.name="mike";  
  28.                         man.sex="男";  
  29.                               
  30.                    }else {  
  31.                         man.name="Lily";  
  32.                         man.sex="女";  
  33.                         }  
  34.                    //上面是已经执行完写的动作   
  35.                   
  36.                    man.flag=true;//写完之后,要把flag设置成true ,这代表已经写完,等被读,如果再执行写操作的话,上面flag=true ,就开始了等待了   
  37.                    num=(num+1)%2;  
  38.                    man.notify();//   
  39.                       
  40.                }  
  41.                               
  42.             }  
  43.     }  
  44. }  
  45. class Output implements Runnable  
  46. {  
  47.     private Man man;  
  48.     public Output(Man m)  
  49.     {  
  50.         this.man=m;  
  51.     }  
  52.     public void run()  
  53.     {  
  54.         while(true)  
  55.         {  
  56.             synchronized(man)  
  57.             {  
  58.                 if(!man.flag)  
  59.                        try { man.wait();}catch(Exception e) {}  
  60.                        
  61.                 System.out.println(man.name+"...."+man.sex);  
  62.                 man.flag=false;  
  63.                 man.notify();  
  64.                   
  65.               
  66.             }  
  67.         }  
  68.     }  
  69. }  
  70. public class Study  
  71. {  
  72.     public static void main(String args[])  
  73.     {  
  74.         Man man=new Man();  
  75.         Thread t1=new Thread(new Input(man));  
  76.         Thread t2=new Thread(new Output(man));  
  77.         t1.start();  
  78.         t2.start();  
  79.     }  
  80. }  
  81. /* 
  82.  *              多线程读者写者问题 
  83.  *                  线程之间的通信一般都是一段共享数据的操作来进行通信的 
  84.  * 
  85.  *          里面的两个线程就是一个读一个写,然而这两个操作是通过两个线程同时进行的.因此如果线程不同步,将会出现安全性问题 
  86.  *          所谓的安全性问题就是线和写和线和读的结果不一样,出就是读出来的值并不是写进行的那样,这样就出来了安全性问题 
  87.  *问题的解决: 
  88.  *      出现这种同时操作一个对象的问题,就是把它们操作那个对象的代码进行同步 
  89.  *      读者与写者的问题要考虑到两个方面: 
  90.  *              1. 读和写的两个线程要同步 
  91.  *              2. 读和写要写进去一个就读一个 
  92.  * 
  93.  *  
  94.  *  
  95.  * */  
  96.  /*                                             2011/10/23  21:22:20 
  97.   * */  

相关内容