我试图编写一个代码,其中多个线程调用共享对象上的方法来递增/递减/打印存储在其中的计数器。我还想要这些数字在 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;
}
}
有人可以查看上面的片段并查看它的陷阱和陷阱吗?
谢谢