84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
比如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 了啊。