从 Java TreeMap 获取同步 Map


要从 Java 中的 TreeMap 获取同步 Map,我们可以使用 Collection 接口的内置方法“synchronizedMap()”。在这里,TreeMap 是一个用于实现 NavigableMap 接口的类。它以树形结构存储映射的元素。它提供了一种有效的替代方案,以排序方式存储键值对。默认情况下,TreeMap 不是同步的。在本文中,我们将解释同步的必要性及其通过示例程序的实际实现。

来自 Tree Map 的同步 Map

TreeMap 不是线程安全的,这意味着当我们在多线程环境中实现它时,多个线程可以同时访问和修改它,而无需任何协调。这可能导致数据不一致和元素的意外行为。它也可能影响操作的结果。

因此,我们需要使用“synchronizedMap()”同步对 TreeMap 元素的访问。此方法在原始 TreeMap 周围创建一个包装器,并在任何线程尝试访问或修改它时锁定它。

synchronizedMap() 是 Collections 类的静态方法,它将 TreeMap 集合的实例作为参数,并从中返回一个同步的 Map。

语法

Collections.synchronizedMap(instanceOfTreeMap);

这里,“Collections”是 Collection 接口的一个类。

TreeMap 的一般语法如下:

语法

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

方法

  • 首先,导入“java.util”包以启用 TreeMap 类的使用。

  • 然后,创建一个 TreeMap,其中键的类型为 String,值的类型为 Integer。

  • 使用内置方法“put()”在集合中存储一些元素

  • 现在,同步这些元素并将它们存储在 Map 类型的变量中。

  • 最后,打印新的同步映射并退出。

示例 1

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

import java.util.*;
public class Maps {
   public static void main(String[] args) {
      TreeMap<String, Integer> cart = new TreeMap<>();
      // 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);
      // print synchronized map from TreeMap
      Map mapSynched = Collections.synchronizedMap(cart);
      System.out.println("Synchronized Map from TreeMap: " + mapSynched);
   }
}

输出

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

方法

  • 首先,导入“java.util”包以启用 TreeMap 类的使用。

  • 然后,创建一个 TreeMap,其中键的类型为 String,值的类型为 Integer

  • 使用内置方法“put()”在集合中存储一些元素

  • 现在,使用 synchronizedMap() 方法同步这些元素并将它们存储在 Map 的新集合中。

  • 最后,定义一个同步块。在此块内,使用“keySet()”方法获取一个 for-each 循环以打印项。

示例 2

在以下示例中,我们将使用 synchronizedMap() 方法和同步块来同步给定的 TreeMap

import java.util.*;
public class Maps {
   public static void main(String[] args) {
      TreeMap<String, Integer> cart = new TreeMap<>();
      // 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 new synchronized Map
      Map<String, Integer> mapSynched = Collections.synchronizedMap(cart);
      System.out.println("Synchronized Map from TreeMap: " );
      // printing synchronized map from TreeMap
      synchronized (mapSynched) {
         for (String unKey : mapSynched.keySet()) {
            System.out.println("Item: " + unKey + ", Quantity: " +
            cart.get(unKey));
         }
      }
   }
}

输出

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

结论

同步是建立协调并确保两个或多个活动之间正确通信的过程。由于 TreeMap 不是同步的,这可能会导致数据不一致,因此我们需要对其进行同步。内置方法“Collections.synchronizedMap()”是执行此任务的更便捷的方法。

更新于: 2023-07-21

323 次查看

启动你的 职业生涯

通过完成课程获得认证

开始
广告