84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
比如StringBuilder在多线程中使用会导致线程不安全,这个不安全会产生什么后果,是数据不正确或丢失.?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
我先给上一段代码,你可以自己运行一下试一试:
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...
会导致数据不一致喽,可能拿到的数据不准确不正确,至于造成啥影响全在你业务逻辑的控制了
比方说线程 A 正在遍历一个 List
for (int i = 0, max = list.size(); i < max; i++) { ... }
遍历的过程中,来了个线程 B,把 list 里面删了个元素,那么线程 A 遍历到最后就会出现 IndexOutOfBoundsException,为什么,因为实际的元素的数量已经变成 max - 1 了啊。
我先给上一段代码,你可以自己运行一下试一试:
上面的代码中,在主线程中new了一个非线程安全的ArrayList,然后开1000个线程分别向这个ArrayList里面添加元素,每个线程添加100个元素,等所有线程执行完成后,这个ArrayList的size应该是多少?应该是100000个?
然而实际运行结果可能不是100000!结果可能会是99946、99955...这就是非线程安全的集合在多线程操作的情况下导致不正确的结果。
具体线程安全这块可以参考我写的一篇博客:http://xxgblog.com/2013/05/16/java-threa...
会导致数据不一致喽,可能拿到的数据不准确不正确,至于造成啥影响全在你业务逻辑的控制了
比方说线程 A 正在遍历一个 List
遍历的过程中,来了个线程 B,把 list 里面删了个元素,那么线程 A 遍历到最后就会出现 IndexOutOfBoundsException,为什么,因为实际的元素的数量已经变成 max - 1 了啊。