java-se - JAVA中多线程使用线程不安全的容器会出现什么情况?
高洛峰
高洛峰 2017-04-17 17:34:29
0
3
610

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua (3)
Peter_Zhu

我先给上一段代码,你可以自己运行一下试一试:

public class Main { public static void main(String[] args) { // 用来测试的ArrayList List list = new ArrayList(); // 线程数量(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 list; private CountDownLatch countDownLatch; public MyThread(List 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...这就是非线程安全的集合在多线程操作的情况下导致不正确的结果。

具体线程安全这块可以参考我写的一篇博客:http://xxgblog.com/2013/05/16/java-threa...

    Peter_Zhu

    会导致数据不一致喽,可能拿到的数据不准确不正确,至于造成啥影响全在你业务逻辑的控制了

      左手右手慢动作

      比方说线程 A 正在遍历一个 List

      for (int i = 0, max = list.size(); i < max; i++) { ... }

      遍历的过程中,来了个线程 B,把 list 里面删了个元素,那么线程 A 遍历到最后就会出现 IndexOutOfBoundsException,为什么,因为实际的元素的数量已经变成 max - 1 了啊。

        Muat turun terkini
        Lagi>
        kesan web
        Kod sumber laman web
        Bahan laman web
        Templat hujung hadapan
        Tentang kita Penafian Sitemap
        Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!