2010-07-05 98 views
0

我正在學習多線程編程;在練習互斥體的同時,我注意到它似乎在我的雙核筆記本電腦上無法正常工作。與smp的Java互斥體

互斥代碼爲http://pastebin.com/axGY5y3c

的結果如下:

count value:t[0]1 
count value:t[1]1 
count value:t[2]2 
count value:t[3]3 
count value:t[4]4 

結果表明,相宜的線程將獲得的開頭相同的初始化值。這看起來不正確。

我的代碼有什麼問題嗎?或者是否有任何資源提供有關在smp/dule-core/multiple cpus上運行java mutex的示例?

感謝您的幫助。

回答

1

我對互斥算法不是很熟悉,所以我不能幫你嚴格關注併發性。我沒有,但是發現在你的一行代碼解釋了爲什麼你得到你所列出的值:當您啓動四個線程

public class MyThread extends Thread{ 
    // [...] 
    private static int count = 0; 

run()被稱爲四次,增加count每次迭代。

的代碼塊:

t[i].start(); 
int v = t[i].getCountValue(); 
System.out.println("count value:t["+i+"]"+v; 

因此有效的是:

count++; 
System.out.println("count value:t["+i+"]"+count); 
+0

此外,在第54行,你暗示'this.count',而'count'是靜態的。 – 2010-07-05 22:53:55

1

正如保羅所說,你的困惑是「計數」被聲明爲靜態的,但是當你檢索它意味着你不希望它是靜態的。基本上,你需要決定你想要什麼程序。

但是......在任何情況下,還有其他一些問題:

    在您的實現
  • ,你所訪問跨線程共享數據結構(每個線程都可能有自己的數組元素,但實際的數組引用是跨線程共享的);根據Java內存模型,您需要採取措施以確保安全(例如聲明數組finalvolatile或使用原子數組)。
  • 有一些標準的併發庫可能在實際中表現得更好(或者至少是正確的和更靈活的),儘管理解併發算法當然不是一件壞事。
0

我想我大概知道我的代碼的問題。 Test.java中的打印行包含函數getCountValue(),它不在lock(mutex.lock()/ mutex.unlock())的邊界;因此當線程開始打印計數值時,由於打印計數值不需要等待其他線程,導致競爭狀態。

移動run()函數內部的getCountValue(),該函數位於鎖的邊界內。結果看起來正確。它打印出來

pid:0 count value:1 
pid:2 count value:2 
pid:3 count value:3 
pid:1 count value:4 
pid:4 count value:5 

再次感謝您的幫助。 我很感激。