Hashtable 已废弃,因全局锁导致并发性能差且API陈旧;HashMap 非线程安全但高效现代;多线程写应优先用 ConcurrentHashMap,其分段锁/CAS 机制保障高并发安全与性能。
Hashtable 是线程安全的,但基本不该用
Java 里
的所有 public 方法都加了
,确实线程安全,但代价是整个表被一把锁罩住——并发读写时严重串行化。JDK 1.5 后就明确不推荐使用,官方文档直接写 “This class is obsolete.”。它不支持
键或值,且继承自已废弃的
类,API 设计陈旧(比如
返回
而非
)。
除非你维护一段 JDK 1.2 时代的遗留代码,否则不要主动选
。
HashMap 是默认选择,但必须自己处理线程安全
非线程安全,单线程下性能好、API 现代、支持
键和值。多线程场景下若直接共享未同步的
,可能触发
,更危险的是在扩容时出现链表环(JDK 7)或数据丢失(JDK 8+),且无任何异常提示。
只读共享:多个线程只读,可用
简单同步:用
,但只是方法级同步,复合操作(如“检查后执行”)仍需手动加锁
高并发写:优先考虑
,分段锁(JDK 7)或 CAS + synchronized 优化(JDK 8+),支持更高吞吐
ConcurrentHashMap 才是现代多线程的正确答案
不是
的升级版,而是从设计上重构的并发哈希表:默认 16 个分段桶(JDK 8 后改为基于
数组 + CAS + 细粒度
),支持高并发读(无锁)、并发写(仅锁具体桶)、迭代时不阻塞写入。
立即学习
“
Java免费学习笔记(深入)
”;
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
注意几个关键差异:
不再是 O(1),可能需遍历多个计数器,返回近似值;如需精确值,用
(返回
)
、
等原子方法是核心优势,避免手写同步块
不支持
键或值(与
一致,但原因不同:为避免在并发中
带来的歧义)
性能差距在真实并发下才明显
单线程下
比
快约 10–20%,
最慢(全局锁开销大)。但一旦有 4+ 线程频繁写入,
吞吐会断崖下跌,
则基本保持线性增长。测试时容易忽略一点:用
测微基准没问题,但若混合 GC、锁竞争、伪共享等,结果会失真。
真正该纠结的不是 “
vs
”,而是 “是否真的需要并发写”——多数 Web 场景里,配置缓存、用户会话映射等,用
+ 原子操作即可;而临时计算中间结果、方法内局部变量,
就够了。
HashtablesynchronizednullDictionaryelements()EnumerationIteratorHashtableHashMapnullHashMapConcurrentModificationExceptionCollections.unmodifiableMap(new HashMap())Collections.synchronizedMap(new HashMap())ConcurrentHashMapConcurrentHashMapHashtableNodesynchronizedsize()mappingCount()longputIfAbsent()computeIfAbsent()nullHashtablenullHashMapConcurrentHashMapHashtableHashtableConcurrentHashMapSystem.nanoTime()HashtableHashMapConcurrentHashMapHashMap