簡體   English   中英

使用Java的Hashtable進行互斥

[英]mutual exclusion using Hashtable of java

嗨,朋友,我班上有一個全局哈希表,還有兩個與她一起工作的線程A和B。 從HashTable讀取A,在Hashtable中寫入B。是否存在互斥的問題? 我需要同步它還是Hashtable類是安全的?

HashtableMap接口的線程安全實現。

在常規的放置和獲取操作中,您將很安全。 但是,當您在一個線程中對其進行迭代並從另一個線程修改其內容時,將遇到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它們。 在下面的示例中,即使containsput是原子的,但代碼具有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.

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