使用AtomicInteger执行线程

时间:2016-06-11 12:40:41

标签: java multithreading atomicinteger

以下问题是针对OCP Java SE 7程序员II考试的模拟考试。解决方案说答案是0,但我的同事和我不确定答案是否在-5和5之间(这是一个选择)有人可以为我们澄清这个吗?这是代码:

import java.util.concurrent.atomic.AtomicInteger;
class AtomicVariableTest {
        private static AtomicInteger counter = new AtomicInteger(0);
        static class Decrementer extends Thread {
                public void run() {
                        counter.decrementAndGet(); // #1
                }
         }
        static class Incrementer extends Thread {
                public void run() {
                        counter.incrementAndGet(); // #2
                }
         }
        public static void main(String []args) {
                for(int i = 0; i < 5; i++) {
                        new Incrementer().start();
                        new Decrementer().start();
                }
                System.out.println(counter);
         }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

使用一些日志多次运行它会显示运行线程的顺序会改变结果。在多次运行中,我确实得到0,但实验结果在我的机器上从-1到2不等。我会说,唯一有效的答案是:介于-5和5之间。

class AtomicVariableTest
{
    private static AtomicInteger counter = new AtomicInteger(0);

    static class Decrementer extends Thread
    {
        public void run()
        {
            counter.decrementAndGet(); // #1
            System.out.println("dec");
        }
    }

    static class Incrementer extends Thread
    {
        public void run()
        {
            counter.incrementAndGet(); // #2
            System.out.println("inc");
        }
    }

    public static void main(String[] args)
    {
        for (int i = 0; i < 5; i++)
        {
            new Incrementer().start();
            new Decrementer().start();
        }
        System.out.println(counter);
    }
}

此计划的输出如下:

inc
dec
inc
dec
inc
dec
inc
dec
0
inc
dec
dec
-1
inc
dec
inc
dec
dec
dec
inc
inc
inc