2 qq 34333347 qq_34333347 于 2016.04.17 03:39 提问

关于Vector的线程安全问题

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

3个回答

caozhy
caozhy   Ds   Rxr 2016.04.17 03:52

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于java线程安全问题
线程:负责一个进程中的代码执行。线程是进程中的一个执行路径。 线程安全问题出现的根本原因: 1. 存在着两个或者两个以上的线程。 2. 多个线程共享了着一个资源, 而且操作资源的代码有多句。 线程安全问题的解决方案: 1. 使用同步代码块 格式: synchronized(锁对象){ 需要被同步的代码; } 线程的生命周期状态图(线程总共有图
vector线程中的应用
关于线程安全的介绍,vector的线程安全性,vector的相关操作。线程安全性的操作.
多线程下vector的安全问题
STL文档说了——vector它不支持多线程,利用以下的代码亲测,   如果是仅仅读取vector中的数据,或者是改变元素的值 多线程没有问题。如果是添加或删除元素,则多线程肯定出问题,需要自己同步。#include <windows.h> #include <process.h> #include <vector> using namespace std; ...
关于Servlet线程安全问题
servlet的实例变量是线程不安全的,而其JSP也默认是以多线程方式执行,所以其线程也是不安全的! 如下 /** * Description: SplitPageXmlServlet.Java * @author dongping * @version 1.0 2005-4-14 */ public class SplitPageXmlServlet extends HttpSer
关于集合类的线程安全问题
在集合类collection中,历史的集合是安全的,比如:vector和hashtable。    之后由于jdk升级出现的,比如:HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap、TreeMap都是线程不安全的,如果有多个线程同时访问它们,且同时有多个线程修改他们的时候,将会出现如读脏数据等错误。Collections提供了sync
关于NSDateFormatter的线程安全问题
今天闲逛,突然捕获一个帖子说NSDateFormatter线程不安全,为了线程安全最好每个线程用自己的对象,如果需要用到的话
delphi关于线程安全问题
TThread提供了几种同步的方法: TThread = class   protected      procedure Synchronize(Method: TThreadMethod); overload; // 在继承中调用同步   public     class procedure Synchronize(AThread: TThread; AMethod: TThreadM
关于同步线程安全问题
记下来,很重要。 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。      二、然而,当一个线程访问ob
关于MINA框架的线程安全问题
最近一直研究MINA来写服务程序,发现了 一些问题,在此记一下,和大家共享,不对之处,多多指教。          MINA可以由我们添加一个线程池,如果没有的话,它会自己产生一个线程池供自己使用,mina的效率还是很不错的。我们可以发现setHandler时候,只添加一个Io
关于servlet线程安全问题
Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。然而,很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题。