Java 并发容器 —— Hashtable 与 Collections.synchronizedMap(HashMap) 的区别
Hashtable 部分源码
以 Hashtable 的 put 方法为例:
Hashtable 保证线程安全的方式在 方法前加上 synchronized 关键字(锁的是类的实例)
Collections.synchronizedMap() 的部分源码
Collections.synchronizedMap()
会调用 静态内部类SynchronizedMap
的构造器 SynchronizedMap(Map<K,V> m)
, synchronized 关键字作用的对象mutex
被设置为 this(即类实例)
静态内部类 SynchronizedMap 的另一个构造方法 SynchronizedMap(Map<K,V> m, Object mutex)
是传入一个 Object 作为 mutex,可以将此 Object 作为 synchronized 修饰的对象
总结:
1、默认 Hashtable 和 synchrnizedMap 都是锁 类实例,synchrnizedMap 可以选择锁其他的 Object(mutex)
2、Hashtable 的 synchronized 是方法级别的;synchrnizedMap 的 synchronized 的代码块级别的
3、两者性能相近,但是 synchrnizedMap 可以用 null 作为 key 和 value
参考资料:
1、Difference between Hashtable and Collections.synchronizedMap(HashMap)
https://*.com/questions/8875680/difference-between-hashtable-and-collections-synchronizedmaphashmap
2、JDK1。8 源码