关于Vector的线程安全问题

一个线程做删除该集合元素的同时,其他线程做查询工作,会有安全问题吗

当然会有安全问题,比如说另一个线程持有一个迭代器对象,那么会导致迭代器状态无效。你有两个办法,一个是锁住向量变量,一个是查询的时候先复制一个vector的副本。关键看你对同步的要求和为读还是写优化(程序里查询的多还是修改的多)

 Java的vector的所有单个方法都是线程安全的,但是如果存在复合操作例如先判断如果不存在就put那么实际上你这两个动作前后是有依赖关系的,所以这两个动作需要同时执行即原子性。但是按照你的描述不同线程都只是执行单个操作,这些动作之间都是互斥的,所以是安全的。

如果是JAVA:
Vector的所有操作方法都被同步了,既然被同步了,多个线程就不可能同时访问vector中的数据,只能一个一个地访问,所以不会出现数据混乱的情况,所以是线程安全的。
如果是C++:
STL 的写、更新操作都不是线程安全的;容器的读操作是线程安全的。
但加锁的话效率不高
参考:http://blog.csdn.net/flyfish1986/article/details/39526251

会的,Vector 的add(),get()等方法被synchronized修饰,add(),get().方法是线程安全的,这没有任何异议。如果有多个线程调用add(),不会出现线程不安全,可是如果多个线程调用
add(),get().那么就会出现线程不安全。该问题在 《深入理解Java虚拟机:JVM高级特性与最佳实践》第 五部分 高效并发中有专门的讲解。大概在第二版第388页。