arraylisthashmap是线程安全的吗吗

java(74)
如果你的代码所在的进程中有多个线程在同时运行,而这些线可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然可以将集合分为两组,线程安全和非线程安全,Vectore是用同步方法来是实现线程安全的而和他相似的ArrayList是线程不安全的。
验证Arraylist为线程不安全类,vectory为线程安全类:
package com.bh.
import java.util.ArrayL
import java.util.C
import java.util.L
import java.util.V
* 验证ArrayList为线程不安全以及解决方法
* microsoft
public class ArrayListInThread2 {
public ArrayListInThread2() {
ThreadGroup group=new ThreadGroup("testGroup");
MyThread at=new MyThread();
for(int i=0;i&10000;i++){
Thread th=new Thread(group,at,String.valueOf(i));
th.start();
while (group.activeCount() & 0) {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(at.list0.size());
System.out.println(at.list0.get(0));
public static void main(String[] args) {
new ArrayListInThread2();
class MyThread implements Runnable {
Vector&String& list0=new Vector&String&();
public void run() {
Thread.sleep((int)(Math.random()*2));
} catch (InterruptedException e) {
e.printStackTrace();
list0.add(Thread.currentThread().getName());
执行程序发现使用arraylist 的时候每次输出的list的长度会不一样。而collection的每次为都1000.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:42535次
积分:2234
积分:2234
排名:第12583名
原创:182篇
转载:28篇
评论:10条
(1)(6)(26)(30)(38)(19)(14)(9)(1)(7)(3)(12)(16)(9)(7)(17)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&arraylist是线程安全的吗_百度知道ArrayList 是线程不安全的 - 推酷
ArrayList 是线程不安全的
发现自己在代码中经常会犯一个常识性错误:在多线程环境下使用同一个 ArrayList。ArrayList 是线程不安全的,不安全性主要表现在元素的操作互相没有互斥性,例如在线程1中添加了元素 a,而在线程2 中查询该 list 的长度时,却可能发现 list 长度为 1,而元素只有一个 null。
talk is cheap:
private static void test(List&String& stringList) {
// 用于获得 List 的实现类名,例如 ArrayList
String className = stringList.getClass().getSimpleName();
new Thread(() -& Stream.of(&1&, &2&).forEach((e) -& {
stringList.add(e);
System.out.println(className + & 添加了 & + e);
System.out.println(className + stringList.toString());
System.out.println(className + & [length=& + stringList.size() + &]&);
})).start();
new Thread(() -& Stream.of(&1&, &2&).forEach((e) -& {
stringList.add(e);
System.out.println(className + & 添加了 & + e);
System.out.println(className + stringList.toString());
System.out.println(className + & [length=& + stringList.size() + &]&);
})).start();}
上述代码是一个方法,用于传入一个 List,然后建立两个线程,同时添加”1”, “2”,两个元素。并且在每次添加之后打印添加的结果。
建立一个 ArrayList 对象,并调用上述方法测试。
List&String& stringList1 = new ArrayList&&();test(stringList1);
代码执行后,输出可能就是这样的(多线程代表了诸多不确定性,每次输出结果都可能不同):
ArrayList 添加了 1ArrayList 添加了 1ArrayList[null, 1]ArrayList[null, 1]ArrayList [length=2]ArrayList 添加了 2ArrayList [length=2]ArrayList 添加了 2ArrayList[null, 1, 2]ArrayList [length=4]ArrayList[null, 1, 2, 2]ArrayList [length=4]
如何改进?
在上述例子中,可以体现出在
的执行过程中出现了一个方法执行到一半而执行了另一个方法的情况,由此产生了输出不一致的问题。针对上述情况,继承 ArrayList 进行同步限制:
private static class SafeArrayList&T& extends ArrayList&T& {
private static final Object lock = new Object();
public boolean add(T o) {
synchronized (lock) {
return super.add(o);
public String toString() {
synchronized (lock) {
return super.toString();
public int size() {
synchronized (lock) {
return super.size();
这样执行之后的输出:
SafeArrayList 添加了 1SafeArrayList[1]SafeArrayList 添加了 1SafeArrayList[1, 1]SafeArrayList [length=2]SafeArrayList [length=2]SafeArrayList 添加了 2SafeArrayList 添加了 2SafeArrayList[1, 1, 2, 2]SafeArrayList[1, 1, 2, 2]SafeArrayList [length=4]SafeArrayList [length=4]
Java 中的 Vector 就是针对于多线程情况下做过处理的一个 List 实现。在上述代码实现中,只实现了三个方法的互斥,实际使用上需要考虑的则远不止这么多,因此需要真正做到线程安全的操作 List 建议使用 Vector。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 抽象类和接口的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信