- 浏览: 36630 次
- 性别:
- 来自: 杭州
最新评论
-
ykdsg:
我想问下rehash()方法中 // 将lastRun之后的整 ...
并发容器分析(五)--ConcurrentHashMap -
borland:
刚才测试了,性能比LinkedBlockingQueue好50 ...
并发容器分析(四)--ConcurrentLinkedQueue
一、简介
JDK5中添加了新的concurrent包,其中包含了很多并发容器,这些容器针对多线程环境进行了优化,大大提高了容器类在并发环境下的执行效率。
CopyOnWriteArrayList类是一个线程安全的List接口的实现,在该类的内部进行元素的写操作时,底层的数组将被完整的复制,这对于读操作远远多于写操作的应用非常适合。在CopyOnWriteArrayList上进行操作时,读操作不需要加锁,而写操作类实现中对其进行了加锁。
二、具体实现
CopyOnWriteArrayList底层的定义如下:
public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { private volatile transient E[] array; private E[] array() { return array; } // 该操作是加锁的,防止array在copy的时候被替换 private synchronized void copyIn(E[] toCopyIn, int first, int n) { array = (E[]) new Object[n]; System.arraycopy(toCopyIn, first, array, 0, n); } ... }
读写操作:
public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { public E get(int index) { // 由于包括rangeCheck和index两个操作,并不是直接在array上执行 // 而是使用本地变量elementData引用array数组,防止两个操作之间 // array被替换 E[] elementData = array(); rangeCheck(index, elementData.length); return elementData[index]; } public synchronized E set(int index, E element) { // 是同步的 int len = array.length; rangeCheck(index, len); E oldValue = array[index]; // 判断该写的元素与原数据是否相同 boolean same = (oldValue == element || (element != null && element.equals(oldValue))); if (!same) { // [1] 创建一个新数组,将原array的值拷贝至新数组 E[] newArray = (E[]) new Object[len]; System.arraycopy(array, 0, newArray, 0, len); // [2] set的元素 newArray[index] = element; // [3] 替换底层array数组 array = newArray; } return oldValue; } ... }
add和remove也采用相同的技术:
public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { public synchronized boolean add(E element) { // [1] new and copy int len = array.length; E[] newArray = (E[]) new Object[len+1]; System.arraycopy(array, 0, newArray, 0, len); // [2] add element newArray[len] = element; // [3] change base array array = newArray; return true; } public synchronized E remove(int index) { int len = array.length; rangeCheck(index, len); E oldValue = array[index]; // new一个新的数组 E[] newArray = (E[]) new Object[len-1]; // copy index之前的元素 System.arraycopy(array, 0, newArray, 0, index); // copy余下的元素 int numMoved = len - index - 1; if (numMoved > 0) System.arraycopy(array, index+1, newArray, index, numMoved); // 替换array引用 array = newArray; return oldValue; } ... }
特别注意:在CopyOnWriteArrayList上获得的Iterator是不能进行set和remove操作的,否则会抛出异常。
发表评论
-
并发容器分析(五)--ConcurrentHashMap
2010-10-13 22:20 2910一、简介 ConcurrentHashMap是Map ... -
并发容器分析(四)--ConcurrentLinkedQueue
2010-10-13 22:20 2393一、简介 ConcurrentLinkedQueue ... -
并发容器分析(三)--LinkedBlockingQueue
2010-10-13 22:19 3302一、简介 LinkedBlockingQueue是B ... -
并发容器分析(二)--ArrayBlockingQueue
2010-10-13 22:19 5369一、简介 BlockingQueue接口定义了一种阻 ... -
JGroups通讯协议(三)--FD_ALL
2009-08-02 21:28 0一、简介 FD协议层用于错误诊断,它们使用心跳检测的 ... -
JGroups通讯协议(二)--PING
2009-08-02 14:12 0一、简介 PING协议 ... -
JGroups通讯协议(一)--UDP
2009-08-02 10:33 0一、简介 UDP是JGroups中默认的通讯协议,它 ... -
JGroups代码分析(二)--协议栈ProtocolStack
2009-07-31 21:11 0一、简介 ProtocolStack是JGroup ... -
JGroups代码分析(一)--编程接口JChannel
2009-07-31 20:19 0一、简介 JGroups是 ... -
netty代码分析(五)--ServerBootstrap
2009-07-23 20:20 0一、简介 ServerBootstrap类封装了服务 ... -
netty代码分析(四)--NioWorker
2009-07-23 19:50 0一、简介 一个NioWorker对象拥有一个独立的线 ... -
netty代码分析(三)--ChannelSink
2009-07-23 19:22 0一、简介 ChannelSink是Downstrea ... -
netty代码分析(二)--ChannelPipeline
2014-10-20 12:45 735一、简介 ChannelPipeline是事件(e ... -
netty代码分析(一)--总体设计
2014-10-20 12:44 610一、简介 Netty3是一个轻量级的NIO框架,它 ... -
Ehcache(二)--Store实现
2009-07-10 15:58 0一、简介 Ehcache中实际的数据存储是由Stor ... -
Ehcache(一)--接口
2009-07-10 15:01 0一、简介 Ehcache是一个从Hibernate ... -
JBoss Cache(四)--Evict策略
2009-07-08 21:47 0一、简介 cache系统在缓存数据达到一定数量后,在 ... -
JBoss Cache(三)--MVCC策略
2009-07-08 15:27 0一、简介 JBoss Cache3.0中加入了MVC ... -
JBoss Cache(二)--核心数据结构
2009-07-08 14:41 0一、简介 在采用command/visitor模式之 ... -
JBoss Cache(一)--总体架构
2009-07-08 14:09 0一、简介 JBoss Cache是一款分布式的缓存, ...
相关推荐
Java并发容器CopyOnWriteArrayList实现原理及源码分析 Java并发容器CopyOnWriteArrayList是Java并发包中提供的一个并发容器,实现了线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现。...
CopyOnWriteArrayList是一种基于Copy-On-Write机制的并发容器,自JDK 1.5开始提供。它的基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后...
并发容器的出现解决了传统同步容器在性能上的不足,通过引入更先进的并发控制策略,如锁分段、CAS算法等,提升了程序的并发性和吞吐量。 首先,我们要理解什么是同步容器。Java 集合框架中的非线程安全容器,如 ...
Java中的同步容器与并发容器是处理多线程环境下数据安全的重要工具。同步容器,如`Vector`和`HashTable`,通过在每个方法上添加`synchronized`关键字实现了线程安全,但这种方式存在性能瓶颈,因为每次操作都需要...
本课程"09、并发容器(Map、List、Set)实战及其原理"深入探讨了如何在多线程环境下有效使用Map、List和Set这三种核心数据结构。下面我们将详细讲解这些并发容器的关键知识点。 1. **并发容器概述**: 在并发编程...
1. CopyOnWriteArrayList的简介 2. COW的设计思想 3. CopyOnWriteArrayList的实现原理 4. 总结 2.读线程间
- **并发容器**:如ConcurrentHashMap、CopyOnWriteArrayList等,它们内部实现了线程安全,减少锁的使用。 - **非阻塞并发**:使用CAS(Compare and Swap)等无锁算法,减少线程间的竞争。 - **异步编程**:使用...
16.并发容器之CopyOnWriteArrayList 17.并发容器之ThreadLocal 18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题 19.并发容器之BlockingQueue 20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理...
在`java.util.concurrent`包中,有四种主要的并发容器类型:队列(BlockingQueue)、Map(ConcurrentMap)、Set(ConcurrentSkipListSet和CopyOnWriteArraySet)以及List(CopyOnWriteArrayList)。这些容器的设计...
2. **并发容器** - **并发集合**:包括线程安全的`Vector`、`Collections.synchronizedXXX`方法转换的同步集合,以及更高效的`ConcurrentHashMap`、`CopyOnWriteArrayList`等并发集合。 - **阻塞队列**:如`...
8. **并发容器**:如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,这些容器在设计时就考虑到了多线程环境下的性能和安全性。 通过分析这个压缩包中的代码,我们可以深入理解这些并发编程概念,并学习如何在实际...
- **线程安全的集合类**:如Vector、HashTable、Collections.synchronizedXXX() 方法产生的同步容器,以及CopyOnWriteArrayList 和 CopyOnWriteArraySet 等并发容器。 - **ConcurrentHashMap**:Java并发编程的...
- **线程安全容器**:如Vector、Collections.synchronizedXXX()方法创建的容器,以及ConcurrentHashMap、CopyOnWriteArrayList等高效并发容器的使用。 - **并发队列**:如ArrayBlockingQueue、LinkedBlockingQueue...
它包含一系列优化过的线程安全容器,如ConcurrentHashMap、CopyOnWriteArrayList等,这些容器提供了高效且线程安全的并发操作。了解它们的工作原理和使用场景对于编写高性能并发程序至关重要。 书中的高级话题可能...
Java 常见并发容器总结 JDK 提供的这些容器大部分在 `java.util.concurrent` 包中。 - **`ConcurrentHashMap`** : 线程安全的 `HashMap` - **`CopyOnWriteArrayList`** : 线程安全的 `List`,在读多写少的场合性能...
本文介绍了几种常见的并发容器:`CopyOnWriteArrayList`、`CopyOnWriteArraySet`、`ConcurrentHashMap`和`ConcurrentSkipListMap`。这些容器的设计考虑到了Java多线程环境下的性能问题,通过不同的技术手段实现了...
Java同步容器和并发容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发。下面我们来一起学习Java同步容器和并发容器的知识点。 一、同步容器 同步容器在Java中主要包括...
3. **并发容器** - **并发集合**:如ConcurrentHashMap、CopyOnWriteArrayList等,了解它们的设计原理和使用场景。 - **阻塞队列BlockingQueue**:如ArrayBlockingQueue、LinkedBlockingQueue等,理解其在生产者-...
例如,ConcurrentHashMap、CopyOnWriteArrayList等都是并发容器。这些容器在多线程环境下可以确保线程安全。 阻塞队列是指在多线程环境下,使用队列来实现线程之间的通信的机制。例如,ArrayBlockingQueue、...
3. **并发容器**:书中详细讨论了`java.util.concurrent`包下的并发容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`BlockingQueue`等。这些容器设计为线程安全,可以提高多线程环境下的性能。 4. **并发...