- 浏览: 36640 次
- 性别:
- 来自: 杭州
最新评论
-
ykdsg:
我想问下rehash()方法中 // 将lastRun之后的整 ...
并发容器分析(五)--ConcurrentHashMap -
borland:
刚才测试了,性能比LinkedBlockingQueue好50 ...
并发容器分析(四)--ConcurrentLinkedQueue
一、简介
BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会阻塞。ArrayBlockingQueue是对BlockingQueue的一个数组实现,它使用一把全局的锁并行对queue的读写操作,同时使用两个Condition阻塞容量为空时的取操作和容量满时的写操作。
二、具体实现
ArrayBlockingQueue底层定义如下:
public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { // 使用循环数组来实现queue,初始时takeIndex和putIndex均为0 private final E[] items; private transient int takeIndex; private transient int putIndex; private int count; // 用于并发的锁和条件 private final ReentrantLock lock; private final Condition notEmpty; private final Condition notFull; /** * 循环数组 * Circularly increment i. */ final int inc(int i) { return (++i == items.length)? 0 : i; } public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0) throw new IllegalArgumentException(); this.items = (E[]) new Object[capacity]; // 分配锁及该锁上的condition lock = new ReentrantLock(fair); notEmpty = lock.newCondition(); notFull = lock.newCondition(); } ... }
ArrayBlockingQueue的取操作:
public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private E extract() { final E[] items = this.items; E x = items[takeIndex]; items[takeIndex] = null; takeIndex = inc(takeIndex); --count; // 激发notFull条件 notFull.signal(); return x; } /** * condition的await的语义如下: * 与condition相关的锁以原子方式释放,并禁用该线程 * 方法返回时,线程必须获得与该condition相关的锁 */ public E take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { try { // 等待notEmpty的条件 while (count == 0) notEmpty.await(); } catch (InterruptedException ie) { notEmpty.signal(); // propagate to non-interrupted thread throw ie; } E x = extract(); return x; } finally { lock.unlock(); } } ... }
ArrayBlockingQueue的写操作:
public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private void insert(E x) { items[putIndex] = x; putIndex = inc(putIndex); ++count; notEmpty.signal(); } public void put(E o) throws InterruptedException { if (o == null) throw new NullPointerException(); final E[] items = this.items; final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { try { // 等待notFull条件 while (count == items.length) notFull.await(); } catch (InterruptedException ie) { notFull.signal(); // propagate to non-interrupted thread throw ie; } insert(o); } finally { lock.unlock(); } } ... }
注意:ArrayBlockingQueue在读写操作上都需要锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式。
发表评论
-
并发容器分析(五)--ConcurrentHashMap
2010-10-13 22:20 2911一、简介 ConcurrentHashMap是Map ... -
并发容器分析(四)--ConcurrentLinkedQueue
2010-10-13 22:20 2394一、简介 ConcurrentLinkedQueue ... -
并发容器分析(三)--LinkedBlockingQueue
2010-10-13 22:19 3304一、简介 LinkedBlockingQueue是B ... -
并发容器分析(一)--CopyOnWriteArrayList
2010-10-13 22:19 8070一、简介 JDK5中添加了新的concurrent包 ... -
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 736一、简介 ChannelPipeline是事件(e ... -
netty代码分析(一)--总体设计
2014-10-20 12:44 611一、简介 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是一款分布式的缓存, ...
相关推荐
并发容器的出现解决了传统同步容器在性能上的不足,通过引入更先进的并发控制策略,如锁分段、CAS算法等,提升了程序的并发性和吞吐量。 首先,我们要理解什么是同步容器。Java 集合框架中的非线程安全容器,如 ...
"并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解" ArrayBlockingQueue和LinkedBlockingQueue是Java并发容器中两个常用的阻塞队列实现,分别基于数组和链表存储元素。它们都继承自AbstractQueue类...
- **线程安全的集合类**:如Vector、HashTable、Collections.synchronizedXXX() 方法产生的同步容器,以及CopyOnWriteArrayList 和 CopyOnWriteArraySet 等并发容器。 - **ConcurrentHashMap**:Java并发编程的...
Java中的同步容器与并发容器是处理多线程环境下数据安全的重要工具。同步容器,如`Vector`和`HashTable`,通过在每个方法上添加`synchronized`关键字实现了线程安全,但这种方式存在性能瓶颈,因为每次操作都需要...
20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java中atomic包中的原子操作类...
2. **并发容器** - **并发集合**:包括线程安全的`Vector`、`Collections.synchronizedXXX`方法转换的同步集合,以及更高效的`ConcurrentHashMap`、`CopyOnWriteArrayList`等并发集合。 - **阻塞队列**:如`...
- **线程安全容器**:如Vector、Collections.synchronizedXXX()方法创建的容器,以及ConcurrentHashMap、CopyOnWriteArrayList等高效并发容器的使用。 - **并发队列**:如ArrayBlockingQueue、LinkedBlockingQueue...
Java并发容器是Java多线程编程中的重要工具,它们提供了高效、线程安全的数据结构,使得在并发环境下处理数据变得更加简单。在`java.util.concurrent`包中,有四种主要的并发容器类型:队列(BlockingQueue)、Map...
3. **并发容器** - **并发集合**:如ConcurrentHashMap、CopyOnWriteArrayList等,了解它们的设计原理和使用场景。 - **阻塞队列BlockingQueue**:如ArrayBlockingQueue、LinkedBlockingQueue等,理解其在生产者-...
2. **并发容器** - **ArrayList vs LinkedList**:比较两者的性能差异,以及在并发环境下的适用性。 - **Vector与Collections.synchronizedList**:了解同步容器的局限性。 - **ConcurrentHashMap**:分析其线程...
并发容器-并⾏是指在多线程环境下,使用并发容器来实现线程安全的容器。例如,ConcurrentHashMap、CopyOnWriteArrayList等都是并发容器-并⾏。 CopyOnWriteArrayList是指在多线程环境下,使用CopyOnWriteArrayList...
在这个专题中,我们将围绕Java并发库、线程管理、锁机制、并发容器以及并发工具类等方面进行深入的源码分析。 首先,Java并发库(java.util.concurrent)是Java并发编程的核心,提供了多种高级并发结构,如Executor...
- **并发容器**:`BlockingQueue`接口及其实现,如`ArrayBlockingQueue`、`LinkedBlockingQueue`,常用于生产者-消费者模型。 4. **原子类** - `Atomic`系列类,如`AtomicInteger`、`AtomicLong`、`...
3. **并发容器** - `ConcurrentHashMap`:线程安全的哈希表,理解其分段锁的设计和操作流程。 - `Atomic`类:如`AtomicInteger`,提供原子操作,用于在不使用锁的情况下实现线程安全。 - `BlockingQueue`:阻塞...
- **并发容器**:如ArrayList、HashMap的并发版本(CopyOnWriteArrayList、ConcurrentHashMap),设计为线程安全,但效率更高。 - **阻塞队列**:如ArrayBlockingQueue、LinkedBlockingQueue,提供生产者-消费者...
2. **并发容器**:如`ConcurrentHashMap`、`BlockingQueue`(如`ArrayBlockingQueue`、`LinkedBlockingQueue`)等,这些容器在并发环境下提供高效且安全的数据共享机制。 3. **线程池**:`ExecutorService`和`...
5. **并发容器** - `BlockingQueue`阻塞队列:实现生产者消费者模型,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。 - `ConcurrentHashMap`并发哈希表:线程安全的哈希表,性能优于`synchronized`修饰的`...
- 选择合适的并发容器; - 适时采用线程池。 ### 总结 《JAVA并发编程实践》一书深入浅出地介绍了Java并发编程的核心概念和技术细节,不仅适合Java开发新手入门,也适合有一定经验的开发者作为参考指南。通过本书...
在Java编程中,`BlockingQueue`是一个非常重要的并发容器,它是Java并发包`java.util.concurrent`中的核心组件。`BlockingQueue`实现了一种线程安全的数据结构,它能够有效地协调生产者和消费者的动作,实现高效的...
以下是对标题和描述中提及的一些并发容器的详细解释: 1. **ConcurrentHashMap**: 是线程安全的HashMap实现,它在不同JVM版本中采用了不同的策略。在Java 7中,它使用分段锁,每个段是一个独立的HashMap,减少锁...