簡體   English   中英

關於Java Collections Framework中的不同步和同步訪問?

[英]About unsynchronized & synchronized access in Java Collections Framework?

任何人都可以在Java Collections Framework中解釋什么是不同步和同步訪問?

同步與非同步訪問與每次查看的Java集合框架無關。

同步訪問意味着您可以使用某種鎖定來訪問數據。 這可以通過使用synchronized關鍵字或使用java.util.concurrent包中的一些更高級別的構造來引入。

非同步訪問意味着訪問數據時涉及任何鎖定。

如果您在多個線程中使用集合,則最好確保以同步方式訪問它,或者集合本身是線程安全的 ,即在內部處理此類鎖定。

要確保以同步方式訪問某些集合coll所有訪問,您可以

  • ...使用synchronized (coll) { ... }環繞聲訪問

     public void someMethod() { synchronized (coll) { // do work... } } 
  • ...使用Collections.synchronizedCollections封裝它

     coll = Collections.synchronizedCollection(coll); 

在前一種方法中,您需要確保synchronized涵蓋對集合的每次訪問 在后一種方法中,您需要確保集合的同步版本中的每個參考點。

正如@Fatal所指出的那樣,您應該理解后一種方法只將線程不安全集合轉換為線程安全集合。 這通常不足以確保編寫的類是線程安全的。 有關示例,請參閱@Fatals注釋。

同步訪問意味着它是線程安全的 因此,不同的線程可以同時訪問集合而沒有任何問題,但根據您正在做的事情,它可能會慢一點。

不同步是相反的。 不是線程安全的,但速度要快一點。

Java Collection Framework中的同步訪問通常通過使用Collections.synchronizedCollection(...)等進行包裝來完成,並且只能通過此包裝器進行訪問。

有一些例外已經同步,如HashtableVector

但請記住:同步是在集合實例本身上完成的,並且每個方法調用都有一個范圍。 因此后續調用可能會被另一個線程中斷。

示例:首先調用isEmtpy()方法獲取不為空的結果,之后要從該集合中檢索元素。 但是第二個方法調用可能會失敗,因為由於您的調用之間的另一個線程的操作,集合現在可能是空的。

因此,即使使用同步集合,您也需要關注同步,並且可能需要在集合之外同步自己!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM