问题描述
- 关于Vector的线程安全问题
-
一个线程做删除该集合元素的同时,其他线程做查询工作,会有安全问题吗
解决方案
当然会有安全问题,比如说另一个线程持有一个迭代器对象,那么会导致迭代器状态无效。你有两个办法,一个是锁住向量变量,一个是查询的时候先复制一个vector的副本。关键看你对同步的要求和为读还是写优化(程序里查询的多还是修改的多)
解决方案二:
Java的vector的所有单个方法都是线程安全的,但是如果存在复合操作例如先判断如果不存在就put那么实际上你这两个动作前后是有依赖关系的,所以这两个动作需要同时执行即原子性。但是按照你的描述不同线程都只是执行单个操作,这些动作之间都是互斥的,所以是安全的。
解决方案三:
如果是JAVA:
Vector的所有操作方法都被同步了,既然被同步了,多个线程就不可能同时访问vector中的数据,只能一个一个地访问,所以不会出现数据混乱的情况,所以是线程安全的。
如果是C++:
STL 的写、更新操作都不是线程安全的;容器的读操作是线程安全的。
但加锁的话效率不高
参考:http://blog.csdn.net/flyfish1986/article/details/39526251
时间: 2024-07-29 03:08:41