1.转载自:http://www.gzu521.com/campus/article/program/200704/145222.htm
- vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
- 五、线程安全类
-
在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。
- 下面是这些线程安全的同步的类:
- <STRONG>vector</STRONG>
- :就比arraylist多了个同步化机制(线程安全)。
- statck:堆栈类,先进后出。
- <STRONG>hashtable</STRONG>
- :就比hashmap多了个线程安全。
- enumeration:枚举,相当于迭代器。
- 除了这些之外,其他的都是非线程安全的类和接口。
- 线程安全的类其方法是同步的,每次只能一个访问。是重量级对象,效率较低。
- 对于非线程安全的类和接口,在多线程中需要程序员自己处理线程安全问题。
vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
五、线程安全类
在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。
下面是这些线程安全的同步的类:
vector
:就比arraylist多了个同步化机制(线程安全)。
statck:堆栈类,先进后出。
hashtable
:就比hashmap多了个线程安全。
enumeration:枚举,相当于迭代器。
除了这些之外,其他的都是非线程安全的类和接口。
线程安全的类其方法是同步的,每次只能一个访问。是重量级对象,效率较低。
对于非线程安全的类和接口,在多线程中需要程序员自己处理线程安全问题。
分析:vector,因为效率较低,现在已经不太建议使用。
在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
(20090414追加)
2.转载自:http://topic.csdn.net/u/20090328/23/9f10c0de-1722-43d0-8c96-8ab1923270e7.html
- hashtable跟hashmap的区别
- hashtable是线程安全的,即hashtable的方法都提供了同步机制!
- hashmap不是线程安全的,即不提供同步机制
- hashtable不允许插入空值,hashmap允许!
hashtable跟hashmap的区别
hashtable是线程安全的,即hashtable的方法都提供了同步机制!
hashmap不是线程安全的,即不提供同步机制
hashtable不允许插入空值,hashmap允许!
3.转载自:http://mahuangyihao.iteye.com/blog/181156
- 线程安全的集合包含2个问题
-
1.多线程并发修改一个集合怎么办?
-
2.如果迭代的过程中集合被修改了怎么办?
- a.一个线程在迭代,另一个线程在修改
- b.在同一个线程内用同一个迭代器对象进行迭代、修改、迭代、修改...
-
-
共有有3种解决方案
-
1.用老的Vector/Hashtable类,上面2个问题都不用担心。
-
Vector/Hashtable所提供的所有方法都是synchronized的。如果迭代的过程中数据结构被修改了,迭代器可以反映最新的修改,也不会抛异常。但这种方法效率低下,不建议使用。
-
-
2.使用ArrayList/HashMap和同步包装器
- 可用同步包装器使容器变成线程安全的
- Java代码
-
1.ListsynchArrayList=Collections.synchronizedList(newArrayList());<br>
-
2.MapsynchHashMap=Collections.synchronizedMap(newHashMap())<br>
-
ListsynchArrayList=Collections.synchronizedList(newArrayList());
-
MapsynchHashMap=Collections.synchronizedMap(newHashMap())
- 如果要迭代,需要这样
- Java代码
-
1.synchronized(synchHashMap)<br>
-
2.{<br>
-
3.Iteratoriter=synchHashMap.keySet().iterator();<br>
-
4.while(iter.hasNext())...;<br>
-
5.}<br>
-
synchronized(synchHashMap)
- {
- Iteratoriter=synchHashMap.keySet().iterator();
-
while(iter.hasNext())...;
- }
-
- 注意上面的代码每次进入同步块都生成了一个新的迭代器。如果你还用老的迭代器,2b的情况就可能发生,你会收到一个ConcurrentModificationException。
-
-
3.用java5.0新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList和CopyOnWriteArraySet
- 对这些集合进行并发修改是安全的。
- 针对2b的问题,迭代器既不抛异常,也不会反映新的修改。就是说你迭代的是生成迭代器时的容器,不是最新的容器。
线程安全的集合包含2个问题
1.多线程并发修改一 个 集合 怎么办?
2.如果迭代的过程中 集合 被修改了怎么办?
a.一个线程在迭代,另一个线程在修改
b.在同一个线程内用同一个迭代器对象进行迭代、修改、迭代、修改. . .
共有有3种解决方案
1.用老的Vector/Hashtable类,上面2个问题都不用担心。
Vector/Hashtable所提供的所有方法都是 synchronized的。如果 迭代的过程中数据结构被修改了,迭代器可以反映最新的修改,也不会抛异常。但这种方法效率低下,不建议使用。
2.使用ArrayList/HashMap和同步包装器
可用 同步包装器使容器变成线程安全的
Java代码
1. List synchArrayList = Collections.synchronizedList(new ArrayList());<br>
2. Map synchHashMap = Collections.synchronizedMap(new HashMap())<br>
List synchArrayList = Collections.synchronizedList(new ArrayList());
Map synchHashMap = Collections.synchronizedMap(new HashMap())
如果要迭代,需要这样
Java代码
1. synchronized (synchHashMap)<br>
2. {<br>
3. Iterator iter = synchHashMap.keySet().iterator();<br>
4. while (iter.hasNext()) . . .;<br>
5. }<br>
synchronized (synchHashMap)
{
Iterator iter = synchHashMap.keySet().iterator();
while (iter.hasNext()) . . .;
}
注意上面的代码每次进入同步块都生成了一个新的迭代器。如果你还用老的迭代器,2b的情况就可能发生,你会收到一个ConcurrentModificationException。
3.用java5.0新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet
对这些集合进行并发修改是安全的。
针对2b的问题,迭代器既不抛异常,也不会反映新的修改。就是说你迭代的是生成迭代器时的容器,不是最新的容器。
分析(20090414追加):
方案1:Vector和HashTable都是线程安全的。
方案2:返回的都是经过封装(线程安全的)的list和map。
->将指定的list和map传进去,传出来的是经过线程安全处理的list和map。(20090507追加)
static
|
synchronizedList (List <T>list) Returns a synchronized (thread-safe) list backed by the specified list. |
static
|
synchronizedMap (Map <K,V>m) Returns a synchronized (thread-safe) map backed by the specified map. |
方案3:这几个类都是位于java.util.concurrent 包中。(concurrent:并发的, 协作的, 一致的。也就是同步的意思。 )
①java.util.concurrent 包中的Class ConcurrentLinkedQueue<E>:An unbounded thread-safe queue based on linked nodes.(无界线程安全队列基于联系节点。)
②java.util.concurrent 包中的Class ConcurrentHashMap<K,V>:A hash table supporting full concurrency of retrievals and adjustable expected concurrency for updates.(哈希表的全面支持并发检索和可调预计并发更新。)
③java.util.concurrent 包中的Class CopyOnWriteArrayList<E>:A thread-safe variant of ArrayList
in which all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array.(线程安全的变体的ArrayList中,所有变化的行动(购买,设置,等等)的实施作出了新的副本的基本元素。)
④java.util.concurrent 包中的Class CopyOnWriteArraySet<E>:A Set
that uses CopyOnWriteArrayList
for all of its operations.(一组使用CopyOnWriteArrayList其所有的业务。)
-》我经过的几个项目开发中,都没有使用过这几个类,很可能是自己的接触面比较狭窄,太孤陋寡闻了。(20090507追加)
分享到:
相关推荐
ArrayList线程安全问题 package com.raicho.mianshi.mycollection; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * @author: Raicho * @Description: * @program: mianshi ...
Java的多种多线程安全集合的介绍和示例代码
java集合类线程安全 写的不错,短小精悍,值得一读
JAVA集合、多线程
java多线程并发查询数据库,使用线程池控制分页,并发查询。
你还在用synchronized?线程安全相关知识深入剖析
Java多线程资源,对于学习很有帮助,如果有什么问题,欢迎大家一起探讨
java集合 线程不安全的集合 HashMap的特点 HashMap的长度(容量)为什么要设计成2的幂? HashTable的特点 TreeMap ArrayList的特点 Vector的特点 LinkedList的特点 Set ConcurrentModificationException异常 线程...
java 核心知识 包含 JVM 线程 集合 数据库 算法 负载等一系列知识点 知识点很全
本资源包“Java多线程与线程安全实践-基于Http协议的断点续传....通过这个实践项目,学生不仅能够加深对Java多线程和线程安全概念的理解,还能提升解决实际问题的能力,为未来的软件开发工作打下坚实的基础。重新回答||
Java多线程运行机制、并发处理面试题目深层解读。
主要介绍了详解java各种集合的线程安全,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
Thread概念 Thread实现方法 Thread生命周期 Thread的安全和锁 Concurrent包(安全集合类、安全Queue) 线程阻塞机制 线程池详解(原理,实际使用) 线程的监控,分析方法 扩展数据库连接池
可以使用Java中的同步机制,如使用synchronized关键字或者使用线程安全的集合类来保证多线程操作的安全性。 实现步骤: 创建一个下载管理器类,用于管理下载任务和线程池。 在下载管理器中实现多线程下载的逻辑,...
Java在面试中的高频考点Java基础、Java集合、Java多线程与并发编程、Java虚拟机、数据库、计算机基础、框架和中间件
本仓库主要讲解Java在面试中的高频考点,分别包含Java基础、Java集合、Java多线程与并发编程、Java虚拟机、数据库、计算机基础、框架和中间件等。
4、线程安全:Java集合框架中的某些数据结构和算法是线程安全的,可以在多线程环境中使用。 Java集合框架中的接口 Java集合框架中定义了一些接口,这些接口是实现各种数据结构的基础。 下面是Java集合框架中的一些...
Java多线程,集合框架(附简单代码)[整理].pdf
JAVA多线程编程集合.pdf