collections.synchronizedcollection 使用粗粒度锁,所有方法同步于集合实例本身,不支持并发读写;遍历需手动加锁,否则抛 concurrentmodificationexception;适用于低并发场景,高并发下应选 concurrenthashmap 等替代方案。

Collections.synchronizedCollection 使用的是粗粒度锁,即整个集合对象一把锁。
锁作用在集合实例本身
它返回的包装对象所有公开方法(add、remove、contains、size 等)内部都以 synchronized(this) 方式同步,锁的是该包装对象自身(也就是底层集合的 mutex 对象)。任意一个线程调用其中任一方法,都会独占这把锁,其他线程对该集合的任何操作都会被阻塞。
不支持并发读写或分段访问
与 ConcurrentHashMap 的分段锁或 CAS 机制不同,它没有按桶、索引或数据段拆分锁。即使两个线程分别操作互不重叠的元素(比如往不同位置 add 或查不同 key),仍需排队等待同一把锁。
遍历必须手动加锁,迭代器无同步保障
iterator() 方法返回的是原始集合的迭代器,不带任何同步逻辑。增强 for 循环本质调用 iterator(),若遍历时有其他线程修改集合,必然触发 ConcurrentModificationException。安全做法是显式同步整个集合:
- synchronized (safeColl) { for (String s : safeColl) { ... } }
- 或采用快照复制:List
snapshot = new ArrayList(safeColl);
适合低并发、简单场景,不适合高吞吐写密集场景
单次操作原子性有保障,但锁竞争明显。当并发线程数上升或操作耗时(如含 I/O)时,性能会显著下降。高频读写混合场景建议改用 java.util.concurrent 包下的替代品,例如 CopyOnWriteArrayList(读多写少)、ConcurrentLinkedQueue(无锁队列)等。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











