同步vs锁vs同步映射
问题描述:
我需要将我的访问同步到散列映射。 这里是我的选项同步vs锁vs同步映射
- 我知道我可以使用Synchronize关键字。这是一种选择。我可以使用地图吗?
- 目前我有一个get方法,如果对象不存在,创建它并将其放入地图中。我可以同步该方法。
- 我可以使用一个syncronize块
- 我可以使用
图M = Collections.synchronizedMap(新的HashMap(...)); 在我的代码中。
我倾向于做4,因为它听起来是最简单的。有什么建议么?
答
我建议你不要使方法同步,并且你不锁定在地图本身。我通常更喜欢使用一个单独的锁定对象,它只有用于锁定和只有在拥有该地图的类中已知。
你可能潜在使用synchronizedMap
,但它取决于你想要用它做什么。如果你只能得到和放置价值,那就没问题。如果您需要在地图上重复迭代,则需要在迭代过程中阻止其他线程修改地图。
另一种选择是使用ConcurrentHashMap
。请参阅文档以了解语义。如果它按照你需要的方式行事,这可能是最简单的方法。
答
你可以使用ConcurrentHashMap.putIfAbsent(),它可以做你想要的而不需要同步。
谢谢。为什么不使用地图本身? – Jeb 2011-05-01 07:43:44
@ useer450602:我真的很想知道*什么样的代码可能最终试图获得一个锁 - 如果我不控制一个锁,就会导致更难解释它。确保* no *其他代码可以锁定某些东西的唯一方法是使其成为只有您的代码才知道开始的对象。 – 2011-05-01 07:46:46