首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程与AtomicInteger

多线程与AtomicInteger
EN

Stack Overflow用户
提问于 2017-03-29 15:49:54
回答 1查看 2.4K关注 0票数 3

我把这段代码摘自原子学教程,它说:-

“通过使用AtomicInteger代替Integer,我们可以在线程安全庄园中并发地增加数字,而不需要同步对变量的访问。方法incrementAndGet()是一个原子操作,因此我们可以从多个线程安全地调用该方法。”

它说这将返回正确的结果,1000但是两个实例都没有达到1000,它们通常要少得多。

代码语言:javascript
复制
test1 result = 532
test2 result = 128

出什么事了?

代码语言:javascript
复制
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();           
    }    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-29 16:00:53

您的问题是,提交线程后立即打印值,尽管并非所有线程都已完成。

代码语言:javascript
复制
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服务完成,您应该看到预期的结果:

代码语言:javascript
复制
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!
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43098352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档