synchronized vs lock vs synchronized map

时间:2011-05-01 07:24:50

标签: java synchronization


我需要同步我对hashmap的访问。 这是我的选择

  1. 我知道我可以使用Synchronize关键字。这是一种选择。我可以使用地图本身吗?
  2. 目前我有一个get方法,如果该对象不存在,则创建它并将其放入地图中。我可以同步方法。
  3. 我可以使用同步块
  4. 我可以用左 Map m = Collections.synchronizedMap(new HashMap(...)); 在我的代码中。
  5. 我倾向于做4因为听起来最简单。有什么建议?

2 个答案:

答案 0 :(得分:5)

我建议您使方法同步,并且您不会锁定地图本身。我通常更喜欢使用一个单独的锁定对象,该对象仅用于 用于锁定,而在拥有该地图的类中已知。

你可能可能使用synchronizedMap,但这取决于你想用它做什么。如果你只得到并放置价值,那就没关系。如果您需要在地图上迭代,则需要阻止其他线程在您进行迭代时修改地图。

另一种选择是使用ConcurrentHashMap。请参阅语义文档。如果它的行为符合您的需要,这可能是最简单的方法。

答案 1 :(得分:2)

您可以使用ConcurrentHashMap.putIfAbsent(),它可以在没有同步的情况下执行您想要的操作。