我有一个“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");
}
}
答案 0 :(得分:0)
我没有得到这个答案。因为它给出了错误的价值 “newValue.count = ++ prevValue.count”。 这里预增量运算符有可能出现“prevValue”的值。 而是将此声明写为 “newValue.count = prevValue.count + 1”。工作正常。