故事的开端:一次社招面试的惊心动魄
前不久,我的朋友小王打算跳槽,于是我俩约了个周末,讨论一下社招面试的重点问题。
“小米,我最近面试了好几家公司,发现‘并发容器’几乎是必考问题!”小王一脸苦恼,“你能不能给我讲讲并发容器的实现,还有同步集合和并发集合的区别?”
“这可是个经典问题,咱们从头聊起。”小米喝了一口咖啡,拉开了话匣子。
传统集合的线程安全问题
“在多线程环境下,你能想到最经典的线程安全问题是什么?”小米问道。
小王想了想,说:“比如 ArrayList 在多线程环境下是不安全的,如果多个线程同时修改它,可能会导致 ConcurrentModificationException。”
“没错!”小米点头,“Java 早期的集合类如 ArrayList、HashMap、LinkedList 等都是非线程安全的,多个线程同时读写会发生数据竞争和不可预期的错误。”
线程安全的早期解决方案:同步容器
“Java 为了解决这个问题,在 JDK 1.2 里提供了 Collections.synchronizedXXX 工具方法,把原本线程不安全的集合变成了同步容器。”小米继续解释: