【问题标题】:synchronized vs lock vs synchronized map同步 vs 锁定 vs 同步映射
【发布时间】:2011-05-01 07:24:50
【问题描述】:


我需要同步我对哈希图的访问。 这是我的选择

  1. 我知道我可以使用 Synchronize 关键字。这是一种选择。我可以使用地图本身吗?
  2. 目前我有一个 get 方法,如果对象不存在,则创建它并将其放入地图中。我可以同步方法。
  3. 我可以使用同步块
  4. 我可以使用
    地图 m = Collections.synchronizedMap(new HashMap(...)); 在我的代码中。

我倾向于做 4,因为这听起来最简单。有什么建议么?

【问题讨论】:

    标签: java synchronization


    【解决方案1】:

    我建议您不要使方法同步,并且不要锁定地图本身。我通常更喜欢使用单独的锁定对象,它only 用于锁定并且only 在拥有地图的类中知道。

    你可以潜在地使用synchronizedMap,但这取决于你想用它做什么。如果您只获取和放置值,那很好。如果您需要在地图上迭代,则需要在迭代时阻止其他线程修改地图。

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

    【讨论】:

    • 谢谢。为什么不使用地图本身?
    • @user450602:我想知道确切地哪些代码最终可能会尝试获取锁 - 如果我无法控制锁,则更难原因。确保 no 其他代码可以锁定某物的唯一方法是使其成为只有您的代码知道开始使用的对象。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多