AtomicReference无法避免java多线程中的竞争条件

时间:2018-03-28 17:08:42

标签: java multithreading synchronization race-condition atomicreference

我有一个“User.java”类,其Integer变量计数最初设置为0。 在另一个类“ThreadDemo.java”中,我在AtomicReference中设置了User对象。 这个“userRef”对象由“1000”线程共享,在每个线程中,我将“count”值递增1。 但在这里我没有得到预期的答案1000.每次执行“count”变量给出不同的值,如1000,1002等。 但是,如果我尝试使用同步或AtomicInteger,那么它的工作原理。 所以我的问题是,在这种情况下,我是否正确使用AtomicReference概念来解决竞争条件。如果是,那么为什么我在这种情况下失败? 。 请在下面找到以下代码: User.java: -

public class User {

     public Integer count=0; 

} 

ThreadDemo.java: -

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

public class ThreadDemo {

    static AtomicReference<User> userRef = new AtomicReference<User>(new User());

    public static void main(final String[] arguments) throws InterruptedException {

        System.out.println("main thread started");

        List<Thread> listThread = new ArrayList<>();

        for (int i = 1; i <= 1000; i++) {
            listThread.add(new Thread() {
                @Override
                public void run() {

                    boolean flag = false;

                    while (!flag) {
                        User prevValue = userRef.get();
                        User newValue = new User();
                        newValue.count = ++prevValue.count;
                        flag = userRef.compareAndSet(prevValue, newValue);
                    }

                }
            });
        }

        for (Thread t : listThread) {
            t.start();
        }

        for (Thread t : listThread) { 
            t.join();
        }

        System.out.println("user count:" + userRef.get().count);
        System.out.println("main thread finished");
    }
}

1 个答案:

答案 0 :(得分:0)

我没有得到这个答案。因为它给出了错误的价值 “newValue.count = ++ prevValue.count”。 这里预增量运算符有可能出现“prevValue”的值。 而是将此声明写为 “newValue.count = prevValue.count + 1”。工作正常。

相关问题