使用单个共享变量递增和递减多个线程时,如何确保线程以同步方式计数并且不跳过任何值。
我创建了一个单独的类,其中有3个不同的方法,一个用于递增,另一个用于递减,最后一个用于返回值。它们都是同步的。
结果显示了一个例子:
正如您所看到的那样,线程正在递减,但随后它会跳转到“291”,这不应该发生,因为我正在使用共享变量。
的 的 ** * ** * ** * 的** * ** * **** 修改的 * ** < EM> * ****
代码: - 共享变量类
public class shareVar extends Thread
{
private static int sharedVariable = 0;
public synchronized static void increment(){
sharedVariable++;
}
public synchronized static void decrement(){
sharedVariable--;
}
public static int value(){
return sharedVariable;
}
}
-----递增类
sVar incrementVal = new sVar();
public synchronized void display(){
for(int countVal = 0; countVal<=max; countVal++ ){
incrementVal.increment();
System.out.println("This is " + threadName + " iteration: " + incrementVal.value() + " of " + max);
//this.yield();
}
System.out.println("*THIS " + threadName + " IS FINISH "
+ "INCREMENTING *");
}
public void run(){
display();
}
答案 0 :(得分:5)
考虑使用AtomicInteger
:
public class Foo
{
private AtomicInteger counter = new AtomicInteger(0);
public void increment()
{
counter.incrementAndGet();
}
public void decrement()
{
counter.decrementAndGet();
}
public int getValue()
{
return counter.get();
}
}
或使用同步方法:
public class Foo
{
private volatile int counter;
public synchronized void increment()
{
counter++;
}
public synchronized void decrement()
{
counter--;
}
public int getValue()
{
return counter;
}
}
答案 1 :(得分:0)
不确定我是否正确理解了您的问题,但是您的输出看起来只是因为另一个线程(Thread_4)在Thread_5输出之前处理该值。
每次迭代都会进行许多操作(简化列表,实际上还有不止这些):
另一个线程可能会在这些操作之间转弯。所以它可能是Thread_5做它做的事情,然后其他线程转动并且只在一段时间后Thread_5输出结果。
如果希望按顺序输出新值,则需要在同步块内输出当前值,即。增量/减量方法。