java多執行緒問題 多核cpu遇上java多執行緒,求解釋

cy_shzu發表於2011-08-16
 

java多執行緒問題 多核cpu遇上java多執行緒,求解釋,程式碼如下:

 

主機win7 i5雙核4執行緒cpu,虛擬機器xp單核,下面程式碼主機和虛擬機器跑得結果差太遠了,
主機執行結果和預期不一樣,虛擬機器卻和預計一樣

class ThreadDemo1
{
 public static void main(String [] args)
 {
    TestThread tt = new TestThread();
  new Thread(tt).start();
  try
  {
   Thread.sleep(1);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  tt.str = new String("method");
  new Thread(tt).start();
 }
}

class TestThread implements Runnable//*/extends Thread//兩種執行緒方式 繼承和實現介面
{//runnable適合多個執行緒處理同一個資源
 int tickets = 100;
 String str = new String("");
 public void run()

 { 
  if(str.equals("method"))
  {
   while(true)
   {
    sale();
   }
  }
  else
  { 
   while(true)
    {
     synchronized(this)//用str時不能同步

     {

      if(tickets > 0)
      {
       try
       {
        Thread.sleep(10);//暫停10毫秒
       }
       catch(Exception e)
       {
        e.printStackTrace();
       }
       System.out.println( Thread.currentThread().getName() + " is saling tacket "+ tickets--);
      }
     }
    }
  }
 }
 public synchronized void sale()//同步函式
 {
  if(tickets > 0)
    {
     try
     { 
      Thread.sleep(10);//暫停10毫秒
     }
     catch(Exception e)
     {
      e.printStackTrace();
     }
     System.out.print("sale(): ");
     System.out.println( Thread.currentThread().getName() + " is saling tacket "+ tickets--);
    }
 }
}

 

主機執行結果,sale方法根本就沒有被執行!

 

 

虛擬機器執行結果:達到預期的同步程式碼塊和同步函式的同步結果

 

求解釋!就高手解釋!

此程式碼源於張孝祥的java視訊,在我機子上執行結果和他視訊上的執行結果不一樣,卻和虛擬機器的貌似一樣。。

 

 

 

網上看到如下某些解釋:

關鍵問題在於,你無法預測每個cpu的時間片分配。所以,要得到你想要的輸出結果就屬於隨機事件了。  對與多核cpu 上的程式同步問題,最好不要用訊號量,互斥量,事件物件,因為它們都屬於核心物件,都是對一個cpu而言的。其他的cpu根本不會理睬你設定的這些東西。

 

 

是不是裡面的監視器this的問題呀。。。

 

經過實驗,用上面的程式碼進行分別用this 和str作為監視器實現死鎖時,主機不出現思索,虛擬機器卻出現死鎖,看來真的跟多核和this有關

 

來個高手解釋下

。。。。。
。。。。。
。。。。。
。。。。。

 

 

 

 

 

 

 

相關文章