0

我正在学习多线程编程;在练习互斥锁时,我注意到它在我的双核笔记本电脑上似乎无法正常工作。

互斥代码位于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

结果表明,线程在开始时似乎会获得相同的 init 值。这看起来不正确。

我的代码有什么问题吗?或者是否有任何资源提供有关在 smp/dule-core/multiple cpus 上运行 java mutex 的示例?

感谢帮助。

4

3 回答 3

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);
于 2010-07-05T22:50:43.157 回答
1

正如保罗所提到的,您会混淆“计数”被声明为静态,但是当您检索它时,您暗示您不希望它是静态的。从根本上说,你需要决定你想让程序做什么。

但是......无论如何,还有其他问题:

  • 在您的实现中,您正在访问跨线程共享的数据结构(每个线程可能有自己的数组元素,但实际的数组引用是跨线程共享的);根据 Java 内存模型,您需要采取措施使其安全(例如声明数组finalvolatile,或使用原子数组);
  • 有标准的并发库实际上可能在实践中表现得更好(或者至少是正确的和更灵活的),尽管作为一项学术练习,理解并发算法当然不是一件坏事。
于 2010-07-05T23:52:46.410 回答
0

我想我大致知道我的代码的问题。Test.java中的打印行包含函数getCountValue(),它不在锁的边界(mutex.lock()/mutex.unlock());因此当线程开始打印计数值时,由于打印计数值不需要等待其他线程,导致竞争条件。

在将 getCountValue() 移动到 run() 函数内之后,该函数位于锁的边界内。结果看起来是正确的。它打印出来

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

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

于 2010-07-11T07:51:39.267 回答