java vector 多线程_Vector 是线程安全的,是不是在多线程下操作Vector就可以不用加Synchronized...

如标题一样,如果之前让我回答,我会说,是的,在多线程的环境下操作Vector,不需要加Synchronized。

但是我今天无意间看到一篇文章,我才发现我之前的想法是错误的,这篇文章的地址:

我摘抄关键的一部分:

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 data;

public TestVector2()

{

data = new Vector();

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();

}

}

结果截屏:

5e1530e9b54715a8a403df090aacca03.png

2012-02-28

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值