使用多个线程递增和递减单个共享变量

时间:2013-03-31 19:14:34

标签: java multithreading concurrency bluej

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

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

结果显示了一个例子:

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

正如您所看到的那样,线程正在递减,但随后它会跳转到“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();
}

2 个答案:

答案 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输出之前处理该值。

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

  1. 增量/减量
  2. 获取当前值
  3. 创建输出字符串
  4. 输出输出字符串
  5. 另一个线程可能会在这些操作之间转弯。所以它可能是Thread_5做它做的事情,然后其他线程转动并且只在一段时间后Thread_5输出结果。

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