1. 程式人生 > >執行緒併發工具--執行緒安全集合

執行緒併發工具--執行緒安全集合

一般的集合,如ArrayList、HashSet、HashMap等,都是執行緒不安全的。不安全的表現是什麼?

ConcurrentModifyException

都知道,在遍歷集合的時候不能對集合進行新增和刪除操作,否則就會拋這個一場。如果一個執行緒正在遍歷一個集合的時候另外一個執行緒往這個集合中增加或刪除了元素,那麼程式就會出這個異常。

這個異常的原理是,集合中有一個版本號,每次修改(新增或刪除)集合的時候,版本號都會往上漲。當開始遍歷集合的時候,先記錄下這個版本號,在遍歷期間,如果發現這個版本號和集合當前的版本號不等,就會拋這個異常。

死迴圈

集合的hasNext方法實現如下:

        public boolean hasNext() {
            return cursor != size;
        }
判斷的是當前的遊標是否和集合的大小相等。當一個執行緒在遍歷集合的時候,cursor是一直往上漲的,直到“遇到"cursor==size()。一種情況是,剛好在這個執行緒快要結束遍歷,即遊標的值剛好等於size的時候,另外一個執行緒不小心從集合中remove了一個元素,那麼size()就減小了,cursor不等於size了,然後cursor繼續往上漲。這樣,cursor就和size擦肩而過,永遠也不能"相見"了,於是死迴圈了。

為此,Java提供了執行緒安全的集合,例如ConcurrentHashMap,CopyOnWriteArrayList。這些集合是執行緒安全的。不會出現ConcurrentModifyException和死迴圈的問題。

相關推薦

執行併發工具--執行安全集合

一般的集合,如ArrayList、HashSet、HashMap等,都是執行緒不安全的。不安全的表現是什麼? ConcurrentModifyException 都知道,在遍歷集合的時候不能對集合進行新增和刪除操作,否則就會拋這個一場。如果一個執行緒正在遍歷一個集合的時候另

執行-day-08多執行執行併發工具總結

目錄 多執行緒和執行緒併發工具總結 執行緒基礎、執行緒之間的共享協作 基礎概念 Java執行緒 執行緒常用方法和執行緒狀態 共享執行緒 執行緒間協作 執行緒併發工具類 Fork-Join分而治之、工作密取 Fork-Join標準正規化 Fork-Joi

Java併發執行 - 併發工具類JUC

安全共享物件策略 1.Java執行緒限制 : 一個被執行緒限制的物件,由執行緒獨佔,並且只能被佔有它的執行緒修改2.共享只讀 : 一個共享只讀的物件,在沒有額外同步的情況下,可以被多個執行緒併發訪問,但是任何執行緒都不能修改它3.執行緒安全物件 : 一個執行緒安全的物件或則容器,在內部通過同步機制來保證執行

Java多執行-併發工具類(二)等待多執行完成的CountDownLatch

參考:https://www.jianshu.com/p/1716ce690637http://ifeve.com/talk-concurrency-countdownlatch/CountDownLatch是什麼CountDownLatch也叫閉鎖,在JDK1.5被引入,允

java執行併發工具類CyclicBarrier、CountDownLatch及Semaphore

一、CyclicBarrier   (原文連結:http://www.studyshare.cn/blog-front/blog/index ) 1、定義 CyclicBarrier是執行緒併發工具類之一,俗稱柵欄。當一組執行緒全部執行完後,到達柵欄屏障,就放開屏障,繼續往後

java執行併發工具

  本次內容主要講Fork-Join、CountDownLatch、CyclicBarrier以及Callable、Future和FutureTask,最後再手寫一個自己的FutureTask,絕對乾貨滿滿!   1、Fork-Join 1.1 什麼是Fork-Join   Java多執行緒的開發可

Java多執行併發工具類-訊號量Semaphore物件講解

Java多執行緒併發工具類-Semaphore物件講解 通過前面的學習,我們已經知道了Java多執行緒併發場景中使用比較多的兩個工具類:做加法的CycliBarrier物件以及做減法的CountDownLatch物件並對這兩個物件進行了比較。我們發現這兩個物件要麼是做加法,要麼是做減法的。那麼有沒有既做加法也

Java多執行-併發執行

執行緒池有了解嗎? 答: java.util.concurrent.ThreadPoolExecutor 類就是一個執行緒池。客戶端呼叫ThreadPoolExecutor.submit(Runnable task) 提交任務,執行緒池內部維護的工作者執行緒的數量就是該執行緒池的執行

Java多執行-併發執行和程序的區別

執行緒和程序的區別 答: 程序是一個“執行中的程式”,是系統進行資源分配和排程的一個獨立單位 執行緒是程序的一個實體,一個程序中擁有多個執行緒,執行緒之間共享地址空間和其他資源(所以通訊和同步等操作執行緒比程序更加容易) 執行緒上下文的切換比程序上下文切換要快

java多執行併發執行

執行緒的常用建立方式 1、繼承Thread類建立執行緒類 public class FirstThreadTest extends Thread { public void run(){ System.out.println("這

Java多執行併發01——執行的建立與終止,你會幾種方式

> 本文開始將開始介紹 Java 多執行緒與併發相關的知識,多謝各位一直以來的關注與支援。關注我的公眾號「Java面典」瞭解更多 Java 相關知識點。 # 執行緒的建立方式 在 Java 中,使用者常用的主動建立執行緒的方式有三種,分別是 **繼承 Thread 類**、**實現 Runnable 介面

執行基礎(三)-多執行併發安全問題

多執行緒基礎(三)-多執行緒併發安全問題 當多個執行緒併發操作同一資源時,由於執行緒切換實際不可控會導致操作邏輯執行順序出現混亂,嚴重時會導致系統癱瘓。例如下面的程式碼 public class SyncDemo { public static void main(Strin

理解Java併發工具執行池的設計

為什麼需要執行緒池? 答:主要原因是因為建立一個執行緒開銷太大,尤其是對大量的小任務需要執行這種場景。 在Java裡面建立一個執行緒,需要包含的東西: (1)它為一個執行緒堆疊分配記憶體,該堆疊為每個執行緒方法呼叫儲存一個幀 (2)每個幀由區域性變數陣列,返回值,運算

併發併發執行安全處理

目錄 執行緒安全性       原子性        提供了互斥訪問,同一時刻只有一個執行緒可以來對它操作       原子包:具有原子性,執行緒安全的, &

Java多執行(二)Java併發工具包concurrent例項簡述

傳統的多執行緒並沒有提供高階特性,例如:訊號量、執行緒池和執行管理器等,而這些特性恰恰有助於建立強大的併發程式。新的Fork/Join框架針對當前的多核系統,也提供了並行程式設計的可能。這塊的內容是java多執行緒資訊量最大的一部分內容,本篇部落格循序漸進的,首

併發工具類(一)等待多執行完成的CountDownLatch

簡介 CountDownLatch 允許一個或多個執行緒等待其他執行緒完成操作。 應用場景 假如有這樣一個需求,當我們需要解析一個Excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析一個sheet裡的資料,等到所有的sheet都解析完之後,程式需要提示解析完成。在這個需求中

併發工具類(四)兩個執行進行資料交換的Exchanger

簡介 Exchanger(交換者)是一個用於執行緒間協作的工具類。Exchanger用於進行執行緒間的資料交換。它提供一個同步點,在這個同步點兩個執行緒可以交換彼此的資料。這兩個執行緒通過exchange方法交換資料, 如果第一個執行緒先執行exchange方法,它會一直等待第二個執行緒也執行

執行同步工具(二)控制併發訪問多個資源

宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷 控制併發訪問多個資源 在併發訪問資源的控制中,你學習了訊號量(semaphores)的基本知識。 在上個指南,你實現了使用binar

執行同步工具(三)等待多個併發事件完成

宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷 等待多個併發事件完成 Java併發API提供這樣的類,它允許1個或者多個執行緒一直等待,直到一組操作執行完成。 這個類就是Count

執行同步工具(五)執行階段性併發任務

宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷 執行階段性併發任務 Java 併發 API 提供的一個非常複雜且強大的功能是,能夠使用Phaser類執行階段性的併發任務。當某些併發