2

我有一个“User.java”类,它的整数变量计数最初设置为 0。在另一个类“ThreadDemo.java”中,我在 AtomicReference 中设置了用户对象。这个“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");
    }
}
4

1 回答 1

0

我没有得到答案。由于“newValue.count = ++prevValue.count”,它给出了错误的值。在这里,预增量运算符将“prevValue”的值取为“prevValue”的值,而是将此语句写为“newValue.count = prevValue.count+1”。它可以正常工作。

于 2018-04-01T14:04:56.957 回答