2013-04-23 108 views
2
public class Mutex { 

private int val; 
public Mutex(int val) { 

    this.val=val; 
} 

public int getVal() { 
    return val; 
} 

public void printVal() 
{ 
    int i=0; 
    while (true) 
    { 

     System.out.println(Thread.currentThread().getName()+" "+this.getVal()); 
     if(i==50) 
      break; 
     else 
      i++; 
    } 
} 

public static void main(String args[]) 
{ 
    final Mutex m1=new Mutex(1); 
    final Mutex m2 = new Mutex(2); 
    new Thread(new Runnable() 
    { 
     @Override 
     public void run() { 

      m1.printVal(); 

     } 
    },"THREAD-1").start(); 
    new Thread(new Runnable() 
    { 
     @Override 
     public void run() { 

      m2.printVal(); 

     } 
    },"THREAD-2").start(); 
} 


    } 

當「val」是「int」類型時,THREAD-1和THREAD-2不交織,而如果我將其類型改爲double,則線程交織。我知道原語是線程安全的(除了long和double)。考慮到上述代碼示例,這個工作到底如何?爲什麼THREAD-1和THREAD-2不交錯?

+1

當我運行此代碼時,無論數據類型如何,我都會看到交織。 – 2013-04-23 10:48:25

+0

printVal()太快,以致於無法確定它是否甚至需要交錯,以便循環50次。做得更多,然後嘗試。 – Ankit 2013-04-23 10:52:06

+0

使用System.nanoTime()來查看線程執行* work *所花費的時間。也許在如此短的時間內不會使上下文切換。線程實驗的有用時間至少從一毫秒開始。 – 2013-04-23 11:02:25

回答

4

嘗試增加50到1000000,也許然後他們會?
線程1在其時隙結束之前完成執行,因此沒有上下文切換。或者,如果您在每次迭代中添加Thread.sleep,那麼您可能會發現它們是交錯的。

0

線程被設計爲儘可能獨立運行。如果你想調用交錯,你可以使用一個循環來調用每個線程。

你應該假設你的線程可以在任何時候啓動和停止,除非你控制它們。出於性能方面的原因,通常最好只在其上放置最少的控件,否則最終會出現更復雜,更慢,而不是更快的解決方案,這通常是使用線程的關鍵。