Vector 方法级内置同步,锁整个对象;ArrayList 完全不提供同步,由调用方负责。Vector 同步粒度粗且无法保证复合操作原子性,ArrayList 性能更优但需外部保障线程安全,现代推荐 CopyOnWriteArrayList 等替代方案。

ArrayList 和 Vector 在同步机制上的核心差异,不是“有没有同步”,而是“谁来负责同步”。
Vector:方法级内置同步
Vector 的所有关键操作(add、remove、get、size、contains 等)都用 synchronized 修饰。这意味着每次调用这些方法时,都会对整个 Vector 实例加锁。一个线程执行 add() 时,其他线程无法同时执行任何其他方法(包括读操作 get() 或 size()),即使它们访问的是不同索引位置。
- 同步粒度粗——锁的是整个对象,不是具体操作或数据段
- 看似安全,但不能保证复合操作的原子性(例如先 check size() 再 get(0),两个调用之间仍可能被其他线程修改)
- 所有同步逻辑由 Vector 自身封装,使用者无需额外编码
ArrayList:完全不提供同步
ArrayList 的所有方法均无 synchronized 关键字,也不使用任何内部锁。它把线程安全的责任完全交给调用方。
- 单线程下无开销,性能更优
- 多线程写入必须由外部保障:可用 Collections.synchronizedList(new ArrayList()) 包装,或配合 synchronized 块、ReentrantLock、或选用 CopyOnWriteArrayList
- 迭代器本身非同步,遍历时若被其他线程修改,会抛 ConcurrentModificationException
同步设计背后的取舍逻辑
Vector 的同步是 JDK 1.0 时代为简化多线程编程做的“一刀切”设计;而 ArrayList 从 JDK 1.2 起就遵循“不为不需要的场景买单”的原则——多数应用是单线程或已由更高层控制并发,强制同步反而拖慢性能。
- 粗粒度同步 ≠ 真正的线程安全:Vector 仍需手动同步复合操作
- 现代推荐方案:需要线程安全列表时,优先考虑 CopyOnWriteArrayList(读多写少)或 ConcurrentHashMap 配合 list 语义,而非 Vector
- Vector 的同步机制已成历史包袱,JDK 官方文档明确标注其为“legacy class”

















