日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

专业写博一天------ArrayList 线程安全

發布時間:2025/7/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 专业写博一天------ArrayList 线程安全 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先我們要了解什么是線程安全:

? ? ? 首先我們要明白線程的工作原理,jvm有一個main ?memory ,而每個線程有自己的working memory,一個線程對一個variable ?進行操作時,都要在自己的working memory 里面建立一個copy,操作完之后再寫入main memory. 多個線程同時操作同一個variable ,就可能會出現不可預知的結果,根據上面的解釋,很容易出現相應的scenario .而用synchronized的關鍵是建立一個monitor,這個monitor可以是要修改的variable也可以其他你認為合適的object比如method,然后通過給這個monitor加鎖來實現線程安全,每個線程在獲得這個鎖之后,要執行完 ? load到workingmemory?? ->?? use&assign?? ->?? store到mainmemory?? 的過程,才會釋放它得到的鎖。這樣就實現了所謂的線程安全。

?

什么是線程安全?

? ? ? 如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。

  或者說:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導致該接口的執行結果存在二義性,也就是說我們不用考慮同步的問題。

  線程安全問題都是由全局變量及靜態變量引起的。

  若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。

? ? ?

? ? ?舉例 比如一個 ArrayList 類,在添加一個元素的時候,它可能會有兩步來完成:

? ? 1. 在 Items[Size] 的位置存放此元素;

? ? 2. 增大 Size 的值。

?

線程安全性:

? ?? ? 類要成為線程安全的,首先必須在單線程環境中有正確行為,如果一個類實現正確,那么沒有一種對這個類的對象操作序列,可以讓對象處于無效狀態,觀察到對象處于無效狀態,或者違反類的任何不可變量,前置條件或者后置條件的情況

? ? ? 此外,一個類要成為線程安全的,在被多個線程訪問時,不管運行時環境執行這些線程有什么樣的時序安排或者交錯,他必須仍有如以上所述的正確行為,并且在調用的代碼中沒有任何額外的同步.其效果就是,在所有線程看來,對于線程安全對象的操作是以固定的,全句一直的順序發生的

? ? ? ?

? ? ? ? 正確性與線程安全性之間的關系非常類似于在描述 ACID(原子性、一致性、獨立性和持久性)事務時使用的一致性與獨立性之間的關系:從特定線程的角度看,由不同線程所執行的對象操作是先后(雖然順序不定)而不是并行執行的。

?

線程安全程度  

??????? 線程安全性不是一個非真即假的命題。 Vector 的方法都是同步的,并且 Vector 明確地設計為在多線程環境中工作。但是它的線程安全性是有限制的,即在某些方法之間有狀態依賴(類似地,如果在迭代過程中 Vector 被其他線程修改,那么由 Vector.iterator() 返回的 iterator會拋出ConcurrentModifiicationException)。

  對于 Java 類中常見的線程安全性級別,沒有一種分類系統可被廣泛接受,不過重要的是在編寫類時盡量記錄下它們的線程安全行為。

  Bloch 給出了描述五類線程安全性的分類方法:不可變、線程安全、有條件線程安全、線程兼容和線程對立。只要明確地記錄下線程安全特性,那么您是否使用這種系統都沒關系。這種系統有其局限性 -- 各類之間的界線不是百分之百地明確,而且有些情況它沒照顧到 -- 但是這套系統是一個很好的起點。這種分類系統的核心是調用者是否可以或者必須用外部同步包圍操作(或者一系列操作)。下面幾節分別描述了線程安全性的這五種類別。

不可變

  不可變的對象一定是線程安全的,并且永遠也不需要額外的同步[1]。因為一個不可變的對象只要構建正確,其外部可見狀態永遠也不會改變,永遠也不會看到它處于不一致的狀態。Java 類庫中大多數基本數值類如 Integer 、 String 和 BigInteger 都是不可變的。

線程安全

  線程安全的對象具有在上面“線程安全”一節中描述的屬性 -- 由類的規格說明所規定的約束在對象被多個線程訪問時仍然有效,不管運行時環境如何排列,線程都不需要任何額外的同步。這種線程安全性保證是很嚴格的 -- 許多類,如 Hashtable 或者 Vector 都不能滿足這種嚴格的定義。

有條件的線程安全

  有條件的線程安全類對于單獨的操作可以是線程安全的,但是某些操作序列可能需要外部同步。條件線程安全的最常見的例子是遍歷由 Hashtable 或者 Vector 或者返回的迭代器 -- 由這些類返回的 fail-fast 迭代器假定在迭代器進行遍歷的時候底層集合不會有變化。為了保證其他線程不會在遍歷的時候改變集合,進行迭代的線程應該確保它是獨占性地訪問集合以實現遍歷的完整性。通常,獨占性的訪問是由對鎖的同步保證的 -- 并且類的文檔應該說明是哪個鎖(通常是對象的內部監視器(intrinsic monitor))。

  如果對一個有條件線程安全類進行記錄,那么您應該不僅要記錄它是有條件線程安全的,而且還要記錄必須防止哪些操作序列的并發訪問。用戶可以合理地假設其他操作序列不需要任何額外的同步。

線程兼容

  線程兼容類不是線程安全的,但是可以通過正確使用同步而在并發環境中安全地使用。這可能意味著用一個 synchronized 塊包圍每一個方法調用,或者創建一個包裝器對象,其中每一個方法都是同步的(就像 Collections.synchronizedList() 一樣)。也可能意味著用 synchronized 塊包圍某些操作序列。為了最大程度地利用線程兼容類,如果所有調用都使用同一個塊,那么就不應該要求調用者對該塊同步。這樣做會使線程兼容的對象作為變量實例包含在其他線程安全的對象中,從而可以利用其所有者對象的同步。

  許多常見的類是線程兼容的,如集合類 ArrayList 和 HashMap 、 java.text.SimpleDateFormat 、或者 JDBC 類 Connection 和 ResultSet 。

線程對立

  線程對立類是那些不管是否調用了外部同步都不能在并發使用時安全地呈現的類。線程對立很少見,當類修改靜態數據,而靜態數據會影響在其他線程中執行的其他類的行為,這時通常會出現線程對立。線程對立類的一個例子是調用 System.setOut() 的類。

??

?

轉載于:https://www.cnblogs.com/zsping/p/5556113.html

總結

以上是生活随笔為你收集整理的专业写博一天------ArrayList 线程安全的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。