[英]mutual exclusion using Hashtable of java
嗨,朋友,我班上有一個全局哈希表,還有兩個與她一起工作的線程A和B。 從HashTable讀取A,在Hashtable中寫入B。是否存在互斥的問題? 我需要同步它還是Hashtable類是安全的?
Hashtable
是Map
接口的線程安全實現。
在常規的放置和獲取操作中,您將很安全。 但是,當您在一個線程中對其進行迭代並從另一個線程修改其內容時,將遇到ConcurrentModificationException
問題。 因此,迭代時,請確保迭代原始Hashtable
的副本。
您應該改用ConcurrentHashMap
,它是java.util.Map
接口的更好/更快的實現。
使用java集合提供的同步HashMap很有用。 此類是一個簡單的包裝器,並封裝了hashmap:
Collections.synchronizedMap(new HashMap());
進一步的示例示例在java docs中: http : //docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.htmlsyncedMap
HashTable
確保對其執行的任何操作都是原子的。 但是,如果要執行多個操作,則應該synchronize
它們。 在下面的示例中,即使contains
和put
是原子的,但代碼具有check and act
條件,因此您需要對此進行附加synchronization
。
if(!hashtable.contains(Object))
{
hashtable.put(key, value);
}
還要檢查Collections.synchronizedMap()
或ConcurrentHashMap
而不是HashTable
每個人都可以說些什么,但這只是對您所說的mutual exclusion
補充。 您在問是否不會出現這樣的問題。 線程安全程序必須確保,如果threadA
使用的是一個代碼塊block1
那么在該線程完成之前,其他線程將無法訪問它。 因此,如果我很好地理解mutual exclusion
含義,那么訪問同一同步(線程安全)共享資源的線程是互斥的,因為它們都不能同時訪問它。
如果選擇建議的安全Map
實現之一,Java實際上會為您帶來很多困難。 現在,如果您的Hashtable(或您喜歡的其他任何線程安全的毛發)是共享資源,那么您唯一需要注意的就是before-before關系。 如果一個線程正在讀取數據而另一線程正在寫入數據,則將非常重要。
可以在Java並發教程和Java並發包文檔中找到更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.