Vector 是线程安全的,是不是在多线程下操作Vector就可以不用加Synchronized
如标题一样,如果之前让我回答,我会说,是的,在多线程的环境下操作Vector,不需要加Synchronized。
但是我今天无意间看到一篇文章,我才发现我之前的想法是错误的,这篇文章的地址:
http://zhangbq168.blog.163.com/blog/static/2373530520082332459511/
我摘抄关键的一部分:
Vector 比 ArrayList慢,是因为vector本身是同步的,而arraylist不是
所以,没有涉及到同步的推荐用arraylist.
看jdk关于vector说明的第3段:
As of the Java 2 platform v1.2, this class has been retrofitted to implement List, so that it becomes a part of Java's collection framework. Unlike the new collection implementations, Vector is synchronized.
显然,vector是同步的,楼主如不想自己实现同步的话,还是将就用一下vector
既然大家都讲到了同步,那么也稍微谈一下,同步了的Hashtable和Vector真的那么有用吗?真的如果用了socalled thread-safe Hashtable and Vector程序代码就不用再同步了吗?
这个例子(Vector vec; Object element;)
if (!vec.contains(element))
vec.add(element);
这段代码可以不同步吗?不可以,context switch might take place right after you do the containg check.
所以,在程序中还是需要:
synchronized (vec)
{
if (!vec.contains(element))
vec.add(element);
}
这样Synchronized Vector比起没有Synchronized ArrayList和LinkedList来说一点好处都没有了。
当时我看到这段内容时,我才发现,是的,先判断当前Vector是否存在这个元素,如果没有,就添加。
我看了一下Vector.java 源代码,发现 contains方法是非同步的。
我自已也写了一个测试程序,结果证明在程序中还是需要:
synchronized (vec)
{
if (!vec.contains(element))
vec.add(element);
}
---------------------------------------------------------------------------------------------------------------------
我写的测试代码如下:
/*
* 测试Vector在多线程下进行任何操作是否真的不需要加 Synchronized
*/
package test.thread;
import java.util.Vector;
public class TestVector2
{
Vector<Integer> data;
public TestVector2()
{
data = new Vector<Integer>();
for(int i=0;i<10;i++)
{
new Add().start();
}
new Del().start();
}
//在多线程进行添加
class Add extends Thread
{
public void run()
{
for(int i=0;i<100;i++)
{
//synchronized(data){
if(!data.contains(6))
{
data.add(6);
int size = data.size();
if(size > 1)
{
System.out.println("data.size > 1 = " + size);
for(int v : data)
{
System.err.println(v);
}
// }
}
}
try
{
sleep((int)(Math.random() * 30));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
//删除
class Del extends Thread
{
public void run()
{
for(int i=0;i<100;i++)
{
if(data.contains(6))
{
data.removeElement(6);
}
try
{
sleep((int)(Math.random() * 30));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
public static void main(String[] args)
{
new TestVector2();
}
}
结果截屏:
2012-02-28
Vector 是线程安全的,是不是在多线程下操作Vector就可以不用加Synchronized的更多相关文章
- 第10章 线程控制(5)_多线程下的fork
6. 线程和fork 6.1 多线程下的fork (1)历史包袱 ①fork与多线程的协作性很差,这是POSIX系统操作系统的历史包袱. ②长期以来程序都是单线程的,fork运行正常,但引入线程这后, ...
- 对于多线程下Servlet以及Session的一些理解
今天,小伙伴突然问到了Servlet是不是线程安全的问题.脑子当时一卡壳,只想到了单实例多线程.这里做一些总结. Servlet体系是建立在Java多线程的基础之上的,它的生命周期是由Tomcat来维 ...
- 你是否听说过 HashMap 在多线程环境下操作可能会导致程序死循环?
作者:炸鸡可乐 原文出处:www.pzblog.cn 一.问题描述 经常有些面试官会问,是否了解过 HashMap 在多线程环境下使用时可能会发生死循环,导致服务器 cpu 100% 的线上故障? 关 ...
- 多线程下的list
前言 list 是 Python 常用的几个基本数据类型之一.正常情况下我们会对 list 有增删改查的操作,显然易见不会有任何问题.那么如果我们试着在多线程下操作list 会有问题吗? 多线程下的 ...
- 多线程下C#如何保证线程安全?
多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题.所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是 ...
- 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼
1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口
JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一. ...
- InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)
上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 p ...
随机推荐
- NodeMCU学习(二) : 如何使用NodeMCU进行开发
NodeMCU的GPIO口 Arduino的引脚号与NodeMCU的GPIO口直接对应,NodeMCU的GPIO函数pinMode, digitalWrite, DigitalRead也是和Ardu ...
- 针对Nginx日志的相关运维操作记录
在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计. 1)Nginx日志的标准格式(可参考: ...
- linux下syslog-ng日志集中管理服务部署记录
syslog是Linux系统默认的日志守护进程,默认的syslog配置文件是/etc/syslog.conf文件.syslog守护进程是可配置的,它允许人们为每一种类型的系统信息精确地指定一个存放地点 ...
- 四则运算coding
https://coding.net/u/ztf1641429293/p/sizeyunshuan/git/blob/master/Sizenyunsuan.java
- C语言ODBC数据库操作
今天我们来介绍一下C语言操作数据库的方法,这里我们使用的是ODBC方式.环境是WIN7+VC6.其他环境也差不多,具体情况具体分析. 首先是环境的配置以及数据源的添加.这里就不去解释了,相关资料网上有 ...
- FICO基础知识(三)
成本中心: 成本中心是企业内的最小职责单位,是每一笔费用的具体接收者.创建成本中心主数据时必须将每个成本中心分配给标准层次结构的某个节点,标准层次结构反映了成本中心与成本中心.成本中心与成本中心组.成 ...
- FICO基础知识(二)
FI中的maser data: COA (Chart Of Account) 科目表 Account 科目 Vendor master dada 供应商主数据 Customer master da ...
- BatchNormalization的使用
# import BatchNormalization from keras.layers.normalization import BatchNormalization # instantiate ...
- delphi7调用数据库连接属性
背景:连接数据库用ADOQuery控件,但是程序一旦编译完成,如果想更改数据库连接设置还得重新修改ADOQuery的属性重新编译 如果可以在程序中可以随时设置ADOQuery的属性则会方便很多. 实现 ...
- Codeforces ECR47F Dominant Indices(线段树合并)
一个比较显然的做法:对每棵子树用线段树维护其中的深度,线段树合并即可. 本来想用这个题学一下dsu on tree,结果还是弃疗了. #include<iostream> #include ...