带smp的Java互斥

带smp的Java互斥,java,concurrency,cpu,smp,Java,Concurrency,Cpu,Smp,我正在学习多线程编程;在练习互斥时,我注意到它似乎不能在我的dule core笔记本电脑上正常工作 互斥代码位于 结果如下: 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核心/多个CPU上运行java互斥的示例 谢谢你的帮助。我对

我正在学习多线程编程;在练习互斥时,我注意到它似乎不能在我的dule core笔记本电脑上正常工作

互斥代码位于

结果如下:

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核心/多个CPU上运行java互斥的示例


谢谢你的帮助。

我对互斥算法不是很熟悉,所以我不能严格地在并发性方面帮你。但是,我在代码中发现了一行代码,解释了为什么会得到列出的值:

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);

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

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

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

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

      在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
      
      再次感谢你的帮助。
      我很感激。

      此外,在第54行中,您暗示
      这个.count
      ,而
      count
      是静态的。