package namespace;class Man {String name;String sex;boolean flag=false;// 定義一個開關變數,用來進行讀或寫的操作}class Input implements Runnable{private Man man;private static int num=1;//用於控制兩次寫進去的值不一樣 public Input(Man m){this.man=m;}public void run(){while(true){ synchronized(man) { if(man.flag)//如果flag=true的話,就代表已經寫進去值了,所以就要等待 try { man.wait();}catch(Exception e) {} if(num==1)//等待被喚醒之後,下面就要對其進行寫的操作了 {man.name="mike";man.sex="男"; }else { man.name="Lily";man.sex="女"; } //上面是已經執行完寫的動作 man.flag=true;//寫完之後,要把flag設定成true ,這代表已經寫完,等被讀,如果再執行寫操作的話,上面flag=true ,就開始了等待了 num=(num+1)%2; man.notify();// }}}}class Output implements Runnable{private Man man;public Output(Man m){this.man=m;}public void run(){while(true){synchronized(man){if(!man.flag) try { man.wait();}catch(Exception e) {} System.out.println(man.name+"...."+man.sex);man.flag=false;man.notify();}}}}public class Study{public static void main(String args[]){Man man=new Man();Thread t1=new Thread(new Input(man));Thread t2=new Thread(new Output(man));t1.start();t2.start();}}/* * 多線程讀者寫者問題 * 線程之間的通訊一般都是一段共用資料的操作來進行通訊的 * *裡面的兩個線程就是一個讀一個寫,然而這兩個操作是通過兩個線程同時進行的.因此如果線程不同步,將會出現安全性問題 *所謂的安全性問題就是線和寫和線和讀的結果不一樣,出就是讀出來的值並不是寫進行的那樣,這樣就出來了安全性問題 *問題的解決: *出現這種同時操作一個對象的問題,就是把它們操作那個對象的代碼進行同步 *讀者與寫者的問題要考慮到兩個方面: *1. 讀和寫的兩個線程要同步 *2. 讀和寫要寫進去一個就讀一個 * * * * */ /*2011/10/23 21:22:20 * */