1.转载自:http://www.gzu521.com/campus/article/program/200704/145222.htm
Java代码
vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
五、线程安全类
在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。
下面是这些线程安全的同步的类:
<STRONG>vector</STRONG>
:就比arraylist多了个同步化机制(线程安全)。
statck:堆栈类,先进后出。
<STRONG>hashtable</STRONG>
:就比hashmap多了个线程安全。
enumeration:枚举,相当于迭代器。
除了这些之外,其他的都是非线程安全的类和接口。
线程安全的类其方法是同步的,每次只能一个访问。是重量级对象,效率较低。
对于非线程安全的类和接口,在多线程中需要程序员自己处理线程安全问题。
分析:vector,因为效率较低,现在已经不太建议使用。
在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
(20090414追加)
2.转载自:http://topic.csdn.net/u/20090328/23/9f10c0de-1722-43d0-8c96-8ab1923270e7.html
Java代码
hashtable跟hashmap的区别
hashtable是线程安全的,即hashtable的方法都提供了同步机制!
hashmap不是线程安全的,即不提供同步机制
hashtable不允许插入空值,hashmap允许!
3.转载自:http://mahuangyihao.iteye.com/blog/181156
Java代码
线程安全的集合包含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的问题,迭代器既不抛异常,也不会反映新的修改。就是说你迭代的是生成迭代器时的容器,不是最新的容器。
分析(20090414追加):
方案1:Vector和HashTable都是线程安全的。
方案2:返回的都是经过封装(线程安全的)的list和map。
->将指定的list和map传进去,传出来的是经过线程安全处理的list和map。(20090507追加)
static <T> List <T>
synchronizedList (List <T>list)
Returns a synchronized (thread-safe) list backed by the specified list.
static <K,V> Map <K,V>
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追加)
分享到:
相关推荐
它展示了如何与非线程安全的类共同工作,并特别关注于Swing的线程问题。新增加的一章介绍了如何为多处理器机器编写并行代码。 简而言之,本书的新版涉及了有关线程的方方面面,从最简单的动画applet到最复杂的应用...
- 常见的线程安全类有`Atomic`系列、`Collections.synchronizedXXX`、`ConcurrentHashMap`等。 这些知识点涵盖了Java多线程与进程的基础和进阶内容,理解并掌握它们对于解决实际的并发问题以及应对面试挑战都极其...
5. **线程安全**:线程安全的函数或数据结构在多线程环境中使用时不会引发不确定行为。线程不安全的函数在多线程中需要额外的同步措施,如互斥锁来保护。 6. **调度策略**:Linux线程调度遵循进程调度的原则,可以...
7. **线程安全**:线程安全是确保在多线程环境下,共享数据的正确性和一致性。C#提供了一些内置的线程安全类,如`ConcurrentQueue`、`ConcurrentStack`和`ConcurrentDictionary`,以及`volatile`关键字来标记易变的...
7. **线程安全**:在多线程环境中,需要考虑线程安全问题,如数据竞争、死锁和活锁等。使用锁(如NSLock、@synchronized关键字)、原子操作(nonatomic属性)或线程局部存储来保证数据的一致性和完整性。 8. **性能...
此外,文档可能还会涉及线程优先级、线程局部存储(TLS)和线程安全问题,帮助开发者在Windows环境下编写高效的多线程程序。 《超线程多核心下Java多线程编程技术分析》聚焦于Java语言的多线程特性。Java提供了一套...
1. **并发编程**:深入解析Java并发模型,包括线程安全、并发控制、死锁避免等。 2. **多线程实践**:如何设计和实现高效的多线程程序,包括线程池的使用和优化。 3. **分布式架构**:介绍分布式系统的设计原则,...
1. **《Java高并发编程详解》2018版**:这本书可能详细介绍了Java平台上的高级并发编程技术,包括Java内存模型、线程安全的数据结构、锁和同步机制(如synchronized、volatile)、并发容器(如ConcurrentHashMap)...
例如,ConcurrentHashMap是一种线程安全的哈希表,它在并发环境下性能优于传统的synchronized HashMap。另外,CopyOnWriteArrayList和CopyOnWriteArraySet在读多写少的情况下表现出色,因为它们在修改时复制底层数据...
- 当多个线程访问和修改共享数据时,如果没有正确同步,可能导致数据不一致,产生线程安全问题。 9. **保证线程安全** - 使用synchronized关键字进行同步控制,确保同一时间只有一个线程能访问临界区。 - 使用...
4) **阻塞队列实现**:`BlockingQueue`接口提供了线程安全的队列操作,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。这些队列在并发编程中广泛用于生产者-消费者模式,通过`put()`和`take()`方法实现元素的...
- **ConcurrentHashMap**:线程安全的哈希表。 - **Atomic*类**:如AtomicInteger、AtomicBoolean等,提供原子操作,适用于高并发场景。 通过这个“Java线程打包”的资源,你可以深入理解并实践Java线程的各个...
线程安全的扩展意味着在多线程环境中,该扩展可以正确处理并发访问,避免数据竞争和其他潜在的同步问题。非线程安全的扩展则通常在单线程或没有明确线程管理的环境中使用,它可能会更轻量级,但不适合在多线程服务器...
26. 进程、线程、协程:进程、线程和协程是操作系统中的基础概念,需要了解它们之间的区别和联系。 27. 安全风险点:在编程中,需要了解各种安全风险点,例如CSRF、SQL注入、XSS等,并采取合适的防御机制。
HashMap 及线程安全的 ConcurrentHashMap,以及各自优劣势 . Java 如何实现线程安全 . Synchronized 和 Lock 哪个更好? . HashMap 中的 get()方法是如何实现的? . HashMap 可以用在哪些场景? . JVM,垃圾回收...
3. **线程安全**:书中深入分析了线程安全的概念,如何识别和避免数据竞争,以及如何编写线程安全的代码。 4. **原子操作**:C++11引入了原子操作,这是实现无锁编程的关键。书中讲解了如何使用原子类型来构建高效...
1. **并发容器**:Java 提供了线程安全的集合类,如 `ConcurrentHashMap`(线程安全的哈希表)、`ConcurrentLinkedQueue`(无界并发队列)和 `CopyOnWriteArrayList`(读多写少场景下的线程安全列表)。 2. **`...
线程安全是指当多个线程访问某个类时,无论运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要额外的同步措施,这个类都能表现出正确的行为。 volatile关键字用于声明变量,确保变量对...
同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,用于解决线程安全问题。 6. **网络编程**:Java提供了Socket和ServerSocket类进行TCP/IP通信,DatagramSocket和DatagramPacket类支持UDP协议...
Java并发编程是基于多线程技术的一种编程技术,该技术是为了解决资源利用率、响应速度、线程安全而创建的,能极大的提高程序的运行效率。JUC是指java.util.concurrent这个jdk自带的包的简称,这个包下有Java5发布的...