2012-12-16 121 views
-2

嘗試在兩個線程之間以最小浪費信號發送信號。 既然已經有一段時間我嘗試過了 - 請提出錯誤/改進建議(如果有的話)。 意向爲: 1.no死鎖 2.no更新被錯過讀取 3.儘量不提高錯過的信號。在效力的順序java線程信號發送

import java.util.Random; 
class shareful{ 

    class share{ 
     int sharedata; 
     volatile boolean isbitset=false; 
     public int getstats(){ 
      return sharedata; 
     } 
     public void setstats(int data){ 
      sharedata=data; 
     } 

     public boolean getbitset(){ return isbitset;} 
     public void setbitset(boolean flag){ isbitset=flag;} 
    } 
    share so=new share(); 
    void runStatistics(){ 
     int check=0; 
     Thread t1=new Thread(new Runnable(){ 
      public void run(){ 
       Random r=new Random(); 
       boolean isflagged=false; 
       while (true){ 
        synchronized(so){ 
         try{ 
          while(so.getbitset()==true){ 
             so.wait(); 
          } 
         } 
         catch(InterruptedException e){} 
         so.setstats(r.nextInt(200)); 
         if(so.getbitset()==false) isflagged=true; 
         so.setbitset(true); 
         if(isflagged) so.notify(); 

        } 
       } 


      } 
     }); 

     Thread t2=new Thread(new Runnable(){ 
      public void run(){ 
       boolean isflagged=false; 
       while(true){ 
        synchronized(so){ 
          try{ 
            while(so.getbitset()==false){ 
            so.wait(); 
           } 
          } 
          catch(InterruptedException e){} 
          int curr=so.getstats(); 
          if(so.getbitset()==true) isflagged=true; 
          so.setbitset(false); 
          if(isflagged) so.notify(); 
        } 

       } 
      } 
     }); 

     t1.start(); 
     t2.start(); 


    } 

    public static void main(String[] args){ 
     shareful s=new shareful(); 
     s.runStatistics(); 
    } 


} 
+4

如果你的代碼確實在工作,你可能想看看http://codereview.stackexchange.com/ –

+0

代碼正在工作(沒有死鎖) - 並且據我所知,只有一個浪費的信號但不知道這是否是最佳選擇。 – IUnknown

+1

恕我直言,「while(true)」的存在是一個明確的指示器,表明此代碼不是最優的。 – mre

回答

1

建議(或反理智,取決於你的觀點):

  1. 停止嘗試手動管理線程,而是使用經過驗證的模式來管理併發喜歡的演員或軟件事務內存取決於什麼適合您的需求。
  2. 處理併發時不要使用可變狀態。
  3. 如果您必須使用可變狀態,至少不要使用任何共享可變狀態。

其他建議:閱讀布賴恩戈茨」‘Java Concurrency in Practice’地發現,你不應該試圖在這個級別中的典型應用編寫代碼。