我把这段代码摘自原子学教程,它说:-
“通过使用AtomicInteger代替Integer,我们可以在线程安全庄园中并发地增加数字,而不需要同步对变量的访问。方法incrementAndGet()是一个原子操作,因此我们可以从多个线程安全地调用该方法。”
它说这将返回正确的结果,1000但是两个实例都没有达到1000,它们通常要少得多。
test1 result = 532
test2 result = 128出什么事了?
public class AtomicsTest {
public static void main(String... args){
AtomicsTest test = new AtomicsTest();
test.test1();
test.test2();
}
public void test1() {
AtomicInteger atomicInt = new AtomicInteger(0);
ExecutorService executor = Executors.newSingleThreadExecutor();
IntStream.range(0,1000).forEach(i->executor.submit( atomicInt::incrementAndGet ));
System.out.println("test1 result = "+ atomicInt.get());
executor.shutdown();
}
public void test2() {
AtomicInteger atomicInt = new AtomicInteger(0);
ExecutorService executor = Executors.newFixedThreadPool(2);
IntStream.range(0,1000).forEach(i->executor.submit( atomicInt::incrementAndGet ));
System.out.println("test2 result = " + atomicInt.get());
executor.shutdown();
}
}发布于 2017-03-29 16:00:53
您的问题是,提交线程后立即打印值,尽管并非所有线程都已完成。
public void test1() {
AtomicInteger atomicInt = new AtomicInteger(0);
ExecutorService executor = Executors.newSingleThreadExecutor();
IntStream.range(0,1000).forEach(i->executor.submit( atomicInt::incrementAndGet ));
// All threads submitted (not necessarily finished)
System.out.println("test1 result = "+ atomicInt.get());
executor.shutdown();
// Threads are still not necessarily done
}如果您在打印值之前显式地等待executor服务完成,您应该看到预期的结果:
public void test1() {
try {
AtomicInteger atomicInt = new AtomicInteger(0);
ExecutorService executor = Executors.newSingleThreadExecutor();
IntStream.range(0,1000).forEach(i->executor.submit( atomicInt::incrementAndGet ));
executor.shutdown();
// Wait a maximum of ~a million billion years
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);
System.out.println("test1 result = "+ atomicInt.get());
}
catch (InterruptedException ex)
{
// Oh no!
}
}https://stackoverflow.com/questions/43098352
复制相似问题