同步SynchronizedMap的性能开销

时间:2014-08-08 21:08:50

标签: java performance synchronization

如果我同步SynchronizedMap会不会有性能损失?

例如:

private static Map<Integer, Integer> intMap= Collections.synchronizedMap(new HashMap<Integer, Integer>());

public static int doSomething(int mapId) {
  synchronized(intMap) {
    Integer id = intMap.get(mapId);
    if (id != null) {
       //do something
    }
    if (id == null) {
       intMap.put(mapId);
    }
  }
}

我必须在上面的方法中显式同步,因为它是在synchronizedMap上的一组操作。既然我必须同步,那么使用普通的hashmap而不是synchronizedMap更好吗?

如果同步synchronizedMap会有性能问题吗?

2 个答案:

答案 0 :(得分:0)

是的,会有性能受到打击。它可能不是很多,因为JVM能够根据使用情况优化这些锁,但它始终存在。

如果您已在该对象上使用synchronized关键字,除非您的程

答案 1 :(得分:0)

是。您正在对已经同步的集合执行不必要的同步。删除额外的同步块将同样安全有效(实际上更有效)。

此外,我进行了小规模的小型测试:https://gist.github.com/AgentTroll/02b77680efe3b92e350f

(忽略许可证,我在GitHub上的一个项目上有它,它就在那里,所以人们不认为我偷了代码)