從Java HashMap獲取同步Map


要從Java中的HashMap獲取同步Map,我們可以使用Collection介面名為“synchronizedMap()”的內建方法。這裡,HashMap是一個用於實現Map介面的類。它以鍵值對的形式儲存其元素。鍵是一個用於獲取和接收與其關聯值的物件。它可以訪問Map介面的所有方法,但本身沒有任何附加方法。不允許重複值,儘管我們可以儲存空值和鍵。在本文中,我們將探討同步的必要性及其透過示例程式的實際實現。

來自HashMap的同步Map

同步Map是可以被多個執行緒安全訪問而不會導致併發問題的Map。另一方面,HashMap是非同步的,這意味著當我們在多執行緒環境中實現它時,多個執行緒可以同時訪問和修改它而沒有任何協調。這可能導致資料不一致和元素的意外行為。它也可能影響操作的結果。

因此,我們需要使用“synchronizedMap()”同步對HashMap元素的訪問。此方法在原始HashMap周圍建立一個包裝器,並在任何執行緒嘗試訪問或修改它時將其鎖定。

synchronizedMap()是Collections類的靜態方法,它接受HashMap集合的例項作為引數,並從中返回一個同步的Map。但是,需要注意的是,只有map本身是同步的,其檢視(例如keyset和entrySet)不是同步的。因此,如果我們想要遍歷同步map,我們需要使用同步塊或鎖來確保獨佔訪問。

語法

Collections.synchronizedMap(instanceOfHashMap);

這裡,“Collections”是Collection介面的一個類。

同步塊的一般語法如下:

語法

synchronized(instanceOfSynchronizedMap) {
   // operation
}

要使用HashMap集合,我們需要使用以下語法建立它的例項

語法

HashMap<TypeOfKey, TypeOfValue> nameOfMap = new HashMap<>();

方法

  • 首先,匯入“java.util”包以啟用HashMap類的使用。

  • 首先,匯入“java.util”包以啟用HashMap類的使用。然後,建立一個HashMap,其中鍵的型別為String,值的型別為Integer。

  • 使用內建方法“put()”將一些元素儲存到集合中。

  • 現在,同步這些元素並將它們儲存在Map型別的變數中。

  • 最後,列印新的同步map並退出。

示例1

以下示例說明了如何使用synchronizedMap()同步指定的HashMap。

import java.util.*;
public class Maps {
   public static void main(String[] args) {
      HashMap<String, Integer> cart = new HashMap<>();
      // Adding elements in the cart map
      cart.put("Butter", 5);
      cart.put("Milk", 10);
      cart.put("Rice", 20);
      cart.put("Bread", 2);
      cart.put("Peanut", 2);
      // printing synchronized map from HashMap
      Map mapSynched = Collections.synchronizedMap(cart);
      System.out.println("Synchronized Map from HashMap: " + mapSynched);
   }
}

輸出

Synchronized Map from HashMap: {Peanut=2, Butter=5, Milk=10, Rice=20, Bread=2}

方法

  • 建立一個HashMap,其中鍵的型別為String,值的型別為Integer。

  • 使用內建方法“put()”將一些元素儲存到集合中。

  • 現在,使用synchronizedMap()方法同步這些元素,並將它們儲存到一個新的Map集合中。

  • 最後,定義一個同步塊。在這個塊中,使用for-each迴圈透過“keySet()”方法列印專案。

示例2

在以下示例中,我們將使用synchronizedMap()方法和同步塊來同步給定的HashMap

import java.util.*;
public class Maps {
   public static void main(String[] args) {
      HashMap<String, Integer> cart = new HashMap<>();
      // Adding elements in the cart map
      cart.put("Butter", 5);
      cart.put("Milk", 10);
      cart.put("Rice", 20);
      cart.put("Bread", 2);
      cart.put("Peanut", 2);
      // creating a new synchronized Map from HashMap
      Map<String, Integer> mapSynched = Collections.synchronizedMap(cart);
      System.out.println("New Synchronized Map from HashMap: ");
      // printing synchronized map from HashMap
      synchronized (mapSynched) {
         for (String unKey : mapSynched.keySet()) {
            System.out.println("Item: " + unKey + ", Quantity: " +
            cart.get(unKey));
         }
      }
    }
}

輸出

New Synchronized Map from HashMap:
Item: Peanut, Quantity: 2
Item: Butter, Quantity: 5
Item: Milk, Quantity: 10
Item: Rice, Quantity: 20
Item: Bread, Quantity: 2

結論

同步是建立協調並確保兩個或多個活動之間正確通訊的過程。由於HashMap是非同步的,這可能會導致資料不一致,因此我們需要對其進行同步。內建方法“Collections.synchronizedMap()”是執行此任務的一種更便捷的方法。

更新於:2023年7月21日

3K+瀏覽量

啟動您的職業生涯

完成課程獲得認證

開始
廣告