vector 是 java 中线程安全的动态数组,通过 synchronized 方法实现粗粒度锁,适合低并发场景;高并发下性能差,推荐用 collections.synchronizedlist 或 copyonwritearraylist 替代。

Vector 是 Java 中自带的线程安全动态数组,底层通过 synchronized 方法保证操作原子性,适合低并发、简单同步需求的场景,但不推荐在高并发环境下直接使用。
Vector 的线程安全性原理
Vector 的大多数公共方法(如 add、get、remove、size)都被 synchronized 修饰,意味着同一时刻只有一个线程能执行某个实例的方法。这避免了多线程同时修改导致的结构损坏或数据不一致问题。
- 所有结构性修改(增删改)和读取操作都加锁,粒度较粗,性能开销明显
- 遍历时仍需手动同步,否则可能抛 ConcurrentModificationException
- 迭代器本身不是 fail-fast 安全的,但因方法加锁,实际运行中不易出错——前提是不混用非同步方式访问
基本用法示例
声明和初始化与 ArrayList 类似,但无需额外同步包装:
Vector<string> list = new Vector();
list.add("a");
list.add("b");
String first = list.get(0); // 自动同步</string>
注意:构造时可指定初始容量和扩容增量,但通常无需显式设置。
遍历 Vector 的正确方式
不能直接用增强 for 循环或 Iterator 遍历后修改集合,否则可能触发异常或逻辑错误:
- 安全读取:用普通 for 循环 + get(i),或在外层 synchronized 块中使用迭代器
- 安全删除:建议用传统 for 倒序遍历,或先收集待删索引再统一 remove
- 避免在 foreach 中调用 add/remove —— 即使 Vector 同步,迭代器内部状态仍可能不一致
替代方案更值得考虑
Vector 是早期 JDK 的遗留类,现代开发中更推荐以下方式:
- Collections.synchronizedList(new ArrayList()):语义清晰,明确表达“需要同步包装”,且可替换为其他 List 实现
- CopyOnWriteArrayList:适用于读多写少场景,迭代安全,无须额外同步
- ConcurrentHashMap + 自定义逻辑:若需更复杂的并发控制(如分段锁、批量操作),可组合使用并发集合
Vector 的 synchronized 粗粒度锁会成为瓶颈,尤其在频繁读写的场景下,响应延迟明显升高。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











