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

发布于 2022-09-02 12:11:47 字数 62 浏览 11 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

枕头说它不想醒 2022-09-09 12:11:48

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

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...这就是非线程安全的集合在多线程操作的情况下导致不正确的结果。

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

感受沵的脚步 2022-09-09 12:11:48

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

醉城メ夜风 2022-09-09 12:11:48

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文