【发布时间】:2012-04-06 16:06:55
【问题描述】:
我试图编写一个代码,其中多个线程调用共享对象上的方法来递增/递减/打印存储在其中的计数器。我还想要这些数字在 0 到 8 之间波动。即输出可能如下所示: 0123234567654566677877666655....
有人可以看看我已经完成了什么,并给我一些关于我是否走在正确轨道上的指示:
我的共享对象:
public class SyncObj{
private int i;
public synchronized void inc(){
if(i<8)
i++;
}
public synchronized void dec(){
if(i > 0)
i--;
}
public synchronized void print(){
System.out.print(i);
}
}
为了防止打印上的饥饿并确保打印每个 inc/dec,我可以有一个名为 hasPrinted 的私有变量并按如下方式重写该类:
public class SyncObj{
private int i;
//Changed Boolean to boolean as Keith Randall pointed out
private boolean hasPrinted = false;
public synchronized void inc(){
if(i<8 && hasPrinted){
i++;
hasPrinted = false;
}
}
public synchronized void dec(){
if(i > 0 && hasPrinted){
i--;
hasPrinted = false;
}
}
public synchronized void print(){
System.out.print(i);
hasPrinted = true;
}
}
有人可以回顾一下上面的 sn-p 并检查它的陷阱和陷阱吗?
谢谢
【问题讨论】:
-
我建议您查看
java.util.concurrent包并使用其中的一种机制。
标签: java multithreading concurrency synchronized