2010-07-05 68 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 

再次感谢您的帮助。 我很感激。