1

使用单个共享变量递增和递减多个线程时,如何确保线程以同步方式计数并且不跳过任何值。

我创建了一个单独的类,其中我有 3 种不同的方法,一种用于递增,另一种用于递减,最后一种用于返回值。它们也都是同步的。

结果显示了一个示例:

  • 这是 Thread_4 迭代:500 中的 -108
    这是 Thread_5 迭代:500 中的 291
    这是 Thread_4 迭代:500 中的 -109
    这是 Thread_4 迭代:500 中的 -110

如您所见,线程正在递减,但随后会跳转到“291”,这在我使用共享变量时不应该发生。

** * ** * ** * ** * ** * ****编辑* ** * ****

代码:- 共享变量类

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();
}
4

2 回答 2

6

考虑使用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;
    }
}
于 2013-03-31T19:20:57.060 回答
0

不确定我是否正确理解了您的问题,但您的输出看起来只是因为另一个线程(Thread_4)在 Thread_5 输出它之前开始处理该值。

每次迭代都会进行许多操作(简化列表,实际上不止这些):

  1. 递增/递减
  2. 获取当前值
  3. 创建输出字符串
  4. 输出输出字符串

另一个线程可能会在这些操作中的任何一个之间轮流。因此,可能是 Thread_5 做了它所做的事情,然后其他线程开始轮流,并且仅在一段时间后 Thread_5 才输出结果。

如果要按顺序输出新值,则需要在同步块内输出当前值,即。递增/递减方法。

于 2013-03-31T20:12:34.133 回答