多线程-关于Vector的线程安全问题

问题描述

关于Vector的线程安全问题

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

解决方案

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

解决方案二:

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

解决方案三:

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

时间: 2024-07-29 03:08:41

多线程-关于Vector的线程安全问题的相关文章

多线程-高手请进!!!---线程安全问题,怎么解决new String 问题

问题描述 高手请进!!!---线程安全问题,怎么解决new String 问题 场景是:一个订单号只能一个在付款,只能一个线程处理,不同的订单号支持并发处理 现在如果是new String("20140719140818");就有问题怎么解决 如果不是new出来的,什么情况会出现问题 public class Test { public static void main(String[] args) { new Thread(){ public void run(){ pay(&quo

在多线程中使用静态方法是否有线程安全问题

   类的成员分为两类,静态成员(static member)和实例成员(instance member).静态成员属于类,实例成员则属于对象,即类的实例.     简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题.      我们在知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用.静态方法不对特定的实例操作,只能访问静态成员.实例方法可对特定的实例操作,既能访问静态

Spring-利用ThreadLocal解决线程安全问题

ThreadLocal是什么 ThreadLocal,顾名思义,它不是一个线程,而是线程的一个本地化对象.当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的变量副本.所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本.从线程的角度看,这个变量就像是线程的本地变量,这也是类名中"Local"所要表达的意思. ThreadLocal的方法很简单,主要的就是4个方法 1234567891011 // 设

Servlet和JSP的线程安全问题

js|servlet|安全|问题 编写Servlet和JSP的时候,线程安全问题很容易被忽略,如果忽视了这个问题,你的程序就存在潜在的隐患. 1.Servlet的生命周期 Servlet的生命周期是由Web容器负责的,当客户端第一次请求Servlet时,容器负责初始化Servlet,也就是实例化这个Servlet类.以后这个实例就负责客户端的请求,一般不会再实例化其他Servlet类,也就是有多个线程在使用这个实例.Servlet之所以比CGI效率高就是因为Servlet是多线程的.如果该Ser

UNIX编程中错误输出的线程安全问题

系统调用失败原因分析 在 UNIX 编程中,我们会经常使用系统调用来完成期望的功能:而与此同时,我们也需要付出大段 的代码来检测.输出错误和其他意外情况. 以下是系统调用失败的可能原因: 系统可能出现资源短缺或者程序使用的资源可能超过系统为单个程序规定的上限.常见的情况有: 程序可能尝试分配大量内存,或者同时打开很多文件等. 程序执行操作时,可能会由于权限不足而被系统阻止.例如,程序可能会试图写一个只读的文件, 或者企图访问其他进程的内存空间. 传入系统调用的参数可能无效,原因可能是用户提供无效

java-Java 单例线程安全问题

问题描述 Java 单例线程安全问题 public class A { public final static A INSTANCE = new A(); private A(){} }这个类是不是线程安全的呢?单例能这样写吗? 解决方案 这种写法是线程安全的.但是在该类一开始被加载的时候INSTANCE = new A()就会被执行.具体参考陈皓的博客深入浅出单实例Singleton设计模式介绍得非常详细. 解决方案二: 如果单线程中初始化,多线程中应用就没问题. 解决方案三: 深入解析单例线

单例模式与线程安全问题浅析

           最近看到到Struts1与Struts2的比较,说Struts1的控制器是单例的,线程不安全的:Struts2的多例的,不存在线程不安全的问题.之后又想到了之前自己用过的HttpHandler...这些类,好像单例的线程安全问题确实是随处可见的.但是只是知道这个是不安全的,也没有认真分析过.接下来就仔细分析下. 一,修改单例模式代码       首先我先写一段单例类的代码:          /** * @ClassName: Sigleton * @Description

java-ThreadLocal是解决线程安全问题

早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本. 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中"Local"所要表达的意思. 所以,在Java中编写线

Java中静态方法的线程安全问题

问题描述 Java中静态方法的线程安全问题 Java中多个线程同时访问一个静态方法是否存在线程安全问题? 比如以下代码,两个线程同时对方法中b修改不同的值,会有线程安全问题吗? new Thread(new Runnable() { @Override public void run() { fun(0); } }).start(); new Thread(new Runnable() { @Override public void run() { fun(1); } }).start(); }