2014-09-30 63 views
4

下面是两种方法,都创建concurrentHashMap的实例,我的理解是方法2是线程安全的但不是方法1。但是我正在与同事和每个人进行对话,因为两者都创建实例concurrentHashMap不应该接近1也是线程安全的吗?线程安全与地图和并发哈希映射

方法1:

private static final Map<key, value> map = new ConcurrentHashMap<key, value>(); 

方法2:

private static final ConcurrentHashMap<key, value> concurrentHashMap = new ConcurrentHashMap<key, value>(); 

希望得到关于此的任何澄清。

+5

这与说“这儿是我儿,约翰”和“这是我的孩子,约翰”之间的区别基本相同。不管你提及约翰如何,iy总是约翰。这是基本的多态,你应该明白,甚至在考虑多线程和线程安全之前,这些更复杂的事情。 – 2014-09-30 19:29:36

+0

您也可以使用'Collections.synchronizedMap(map)'。 – Hannes 2014-09-30 20:47:13

回答

6

您在这两种情况下都创建了ConcurrentHashMap,所以线程安全性完全相同。

ConcurrentHashMap实现Map接口,这是您在示例1中调用的接口。但是,这对实例化的底层对象没有影响。

2

显然,对象在两种情况下都具有相同的运行时类型。

但是,当作为Map查看时,putIfAbsent和其他ConcurrentMap方法对客户端隐藏。否认他们并强迫他们使用传统的putget是我期望您的同事所表达的担忧。

0

以下仅为Map对象创建一个指针并将其实例化为null。

private static final Map<key, value> map; 

下面一行是在对象为创建真正的,在这两种情况下是一个实例的ConcurrentHashMap,变量映射指向它的地址。 这是重要的,实际的情况。

map = new ConcurrentHashMap<key, value>(); 

所以不能有任何两者之间的区别!

1

这两种解决方案都是线程安全的。你应该更熟悉java接口:) 因为两者都是对同一个映射实现的引用。第一种解决方案通过界面隐藏了这一事实,其次不是。 第一种方法甚至是claner-它涉及到集合时,推荐使用api接口而不是class obj。这将有助于将更改应用于您的代码。 我希望我的解释能有所帮助。