带smp的Java互斥
我正在学习多线程编程;在练习互斥时,我注意到它似乎不能在我的dule core笔记本电脑上正常工作 互斥代码位于 结果如下:带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互斥的示例 谢谢你的帮助。我对
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
是静态的。