开发者社区 > 云原生 > 容器服务 > 正文

JAVA中多线程使用线程不安全的容器会出现什么情况?

比如StringBuilder在多线程中使用会导致线程不安全,这个不安全会产生什么后果,是数据不正确或丢失.?

展开
收起
蛮大人123 2016-03-12 10:21:40 2545 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪
    public class Main {
        
        public static void main(String[] args) {
            // 用来测试的ArrayList
            List<Object> list = new ArrayList<Object>();
    
            // 线程数量(1000)
            int threadCount = 1000;
    
            // 用来让主线程等待threadCount个子线程执行完毕
            CountDownLatch countDownLatch = new CountDownLatch(threadCount);
    
            // 启动threadCount个子线程
            for (int i = 0; i < threadCount; i++) {
                Thread thread = new Thread(new MyThread(list, countDownLatch));
                thread.start();
            }
    
            try {
                // 主线程等待所有子线程执行完成,再向下执行
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            // List的size
            System.out.println(list.size());
        }
    
    }
    
    class MyThread implements Runnable {
        private List<Object> list;
    
        private CountDownLatch countDownLatch;
    
        public MyThread(List<Object> list, CountDownLatch countDownLatch) {
            this.list = list;
            this.countDownLatch = countDownLatch;
        }
    
        public void run() {
            // 每个线程向List中添加100个元素
            for (int i = 0; i < 100; i++) {
                list.add(new Object());
            }
    
            // 完成一个子线程
            countDownLatch.countDown();
        }
    }

    上面的代码中,在主线程中new了一个非线程安全的ArrayList,然后开1000个线程分别向这个ArrayList里面添加元素,每个线程添加100个元素,等所有线程执行完成后,这个ArrayList的size应该是多少?应该是100000个?
    然而实际运行结果可能不是100000!结果可能会是99946、99955...这就是非线程安全的集合在多线程操作的情况下导致不正确的结果。

    2019-07-17 19:00:17
    赞同 展开评论 打赏

国内唯一 Forrester 公共云容器平台领导者象限。

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版
  • 相关电子书

    更多
    Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
    The Reactive Cloud Native Arch 立即下载
    JAVA开发手册1.5.0 立即下载