亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從集合類獲取同步集合是否同步一個類?

從集合類獲取同步集合是否同步一個類?

冉冉說 2022-12-21 09:34:34
我試圖了解synchronizedCollection、synchronizedList、synchronizedMap和synchronizedSet其他此類方法的作用。據我了解,同步可以在塊和方法上完成,而不是在類上完成,所以假設我有一個哈希圖。HashMap<Integer,String> hashMap = new HashMap<Integer,String>(); HashMap<Integer,String> syncHashMap = Collections.synchronizedMap(hashMap);問題那么上面的代碼只是同步了整個syncHashMap類還是其中的每個方法?如果我們可以簡單地使用線程安全集合,例如 ConcurrentHashMap或SynchronizedMap在多線程場景中,那么 Collections.synchronizedMap(hashMap)Collections 類中需要什么和其他類似方法將非常感謝這方面的一些指導,在此先感謝。
查看完整描述

4 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

  1. 那么上面的代碼只是同步了整個 syncHashMap 類還是其中的每個方法?

不確定同步整個 syncHashMap 類及其中的每個方法是什么意思。

如果你查看 method 的源代碼Collections.synchronizedMap(hashMap),你會發現它使用synchronized關鍵字來修飾原始映射的每個方法。這意味著對于裝飾后的地圖對象,您一次只能調用其方法之一。但是不同的地圖,你可以一次調用它們。

  1. 你可以在這里找到它們的用法。ConcurrentHashMap 與同步 HashMap


查看完整回答
反對 回復 2022-12-21
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

據我了解,它Collections.synchronizedMap不保證存儲對象中的字段值將被同步,但映射中的每個條目synchronized方法內修改時將被同步。它不保證任何其他內容。每當在另一個線程中修改同步映射時,其他線程中同一映射的其他引用將同步。

這是我根據這個來源以及Java文檔對它的粗淺理解。


查看完整回答
反對 回復 2022-12-21
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

有幾個術語涉及您所詢問的主題。

同步化

有許多接口和類可以幫助您在線程之間同步代碼。一個Semaphore,一個CyclicBarrier或像BlockingQueue這樣的同步集合。有關這些類的列表,請參閱java.util.concurrent包。

synchronized塊也是一種同步方式,但正確使用它需要更多經驗。

互斥量

不同的語言(和庫)以不同的方式實現標準互斥鎖。這個想法保持不變——為了繼續執行特定代碼,一個互斥令牌,必須獲得一個互斥體。在 Java 中,這種獲取發生在進入synchronized塊之前。

線程安全

簡而言之,當一個類的所有方法可以從任意數量的線程以任意順序同時訪問時,它就是線程安全的。有幾種方法可以實現線程安全。例如,字符串是線程安全的。它們不是同步的,但它們是不可變的,這也會導致線程安全。所有Collections.synchronized*()方法都返回集合的線程安全包裝器,前提是所有未來*(*請參閱先發生關系)對它們的訪問都是通過這些包裝器執行的(這就是為什么初學者只調用Collections.synchronized*()onnew對象是一個很好的規則。

答案

根據前面段落的知識,回答你的問題:不,它不同步一個類。它根本不會改變原來的Collection實現。但是,它確實為該類創建了一個讀寫線程安全的同步可變代理。


查看完整回答
反對 回復 2022-12-21
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

在回答您的問題之前,讓我們重申一些同步的基礎知識

  • 同步總是在一個對象/實例上。每個同步實例都由一個鎖(稱為互斥鎖)保護。

  • 任何在對象上調用同步方法的線程都必須先獲取該鎖,然后再調用該方法。

  • 調用未同步方法的原因不需要此鎖獲取。

回答你的問題:

  1. 那么上面的代碼只是同步了整個 syncHashMap 類還是其中的每個方法?

是的,它確實。在這里查看Collections.SynchronizedMap 的源代碼即可。注意幾乎每個方法都有同步(互斥)塊。

  1. 如果我們可以在多線程場景中簡單地使用線程安全的集合,例如 ConcurrentHashMap 或 SynchronizedMap,那么 Collections 類中的 Collections.synchronizedMap(hashMap) 和其他類似方法的需求是什么?

好吧,同步每個方法(包括只讀類型的方法)都有缺點。它不必要地減慢了讀取操作,因此您的觀察是正確的,即使用諸如 ConcurrentHashMap 之類的實現,它只鎖定正在修改集合的方法。只讀方法不同步,因此在具有并發讀/寫操作的多線程場景中速度更快。

Collections.synchronizedMap 提供的唯一優勢是保留輸入鍵的順序。因此,當您需要時,您可以使用 Collections.synchronizedMap。


查看完整回答
反對 回復 2022-12-21
  • 4 回答
  • 0 關注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號