- 浏览: 36632 次
- 性别:
- 来自: 杭州
最新评论
-
ykdsg:
我想问下rehash()方法中 // 将lastRun之后的整 ...
并发容器分析(五)--ConcurrentHashMap -
borland:
刚才测试了,性能比LinkedBlockingQueue好50 ...
并发容器分析(四)--ConcurrentLinkedQueue
一、简介
LinkedBlockingQueue是BlockingQueue的一种使用Link List的实现,它对头和尾(取和添加操作)采用两把不同的锁,相对于ArrayBlockingQueue提高了吞吐量。它也是一种阻塞型的容器,适合于实现“消费者生产者”模式。
二、具体实现
LinkedBlockingQueue底层的定义如下:
public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { static class Node<E> { /** The item, volatile to ensure barrier separating write and read */ volatile E item; Node<E> next; Node(E x) { item = x; } } // 支持原子操作 private final AtomicInteger count = new AtomicInteger(0); // 链表的头和尾 private transient Node<E> head; private transient Node<E> last; // 针对取和添加操作的两把锁及其上的条件 private final ReentrantLock takeLock = new ReentrantLock(); private final Condition notEmpty = takeLock.newCondition(); private final ReentrantLock putLock = new ReentrantLock(); private final Condition notFull = putLock.newCondition(); ... }
LinkedBlockingQueue的添加操作:
public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private void insert(E x) { last = last.next = new Node<E>(x); } /** * signal方法在被调用时,当前线程必须拥有该condition相关的锁! * Signal a waiting take. Called only from put/offer (which do not * otherwise ordinarily lock takeLock.) */ private void signalNotEmpty() { final ReentrantLock takeLock = this.takeLock; takeLock.lock(); try { notEmpty.signal(); } finally { takeLock.unlock(); } } public void put(E o) throws InterruptedException { if (o == null) throw new NullPointerException(); int c = -1; final ReentrantLock putLock = this.putLock; final AtomicInteger count = this.count; // 使用putLock putLock.lockInterruptibly(); try { try { // 当容量已满时,等待notFull条件 while (count.get() == capacity) notFull.await(); } catch (InterruptedException ie) { notFull.signal(); // propagate to a non-interrupted thread throw ie; } insert(o); // 取出当前值,并将原数据增加1 c = count.getAndIncrement(); // 容量不满,再次激活notFull上等待的put线程 if (c + 1 < capacity) notFull.signal(); } finally { putLock.unlock(); } // 必须先释放putLock再在notEmpty上signal,否则会造成死锁 if (c == 0) signalNotEmpty(); } ... }
LinkedBlockingQueue的取操作:
public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private E extract() { Node<E> first = head.next; head = first; E x = first.item; first.item = null; return x; } private void signalNotFull() { final ReentrantLock putLock = this.putLock; putLock.lock(); try { notFull.signal(); } finally { putLock.unlock(); } } public E take() throws InterruptedException { E x; int c = -1; final AtomicInteger count = this.count; final ReentrantLock takeLock = this.takeLock; // 使用takeLock takeLock.lockInterruptibly(); try { try { // 若容量为空,等待notEmpty while (count.get() == 0) notEmpty.await(); } catch (InterruptedException ie) { notEmpty.signal(); // propagate to a non-interrupted thread throw ie; } x = extract(); c = count.getAndDecrement(); // 再次激活notEmpty if (c > 1) notEmpty.signal(); } finally { takeLock.unlock(); } // take执行之前容量已满,则激活notFull if (c == capacity) signalNotFull(); return x; } ... }
发表评论
-
并发容器分析(五)--ConcurrentHashMap
2010-10-13 22:20 2910一、简介 ConcurrentHashMap是Map ... -
并发容器分析(四)--ConcurrentLinkedQueue
2010-10-13 22:20 2393一、简介 ConcurrentLinkedQueue ... -
并发容器分析(二)--ArrayBlockingQueue
2010-10-13 22:19 5369一、简介 BlockingQueue接口定义了一种阻 ... -
并发容器分析(一)--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 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是一款分布式的缓存, ...
相关推荐
并发容器的出现解决了传统同步容器在性能上的不足,通过引入更先进的并发控制策略,如锁分段、CAS算法等,提升了程序的并发性和吞吐量。 首先,我们要理解什么是同步容器。Java 集合框架中的非线程安全容器,如 ...
"并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解" ArrayBlockingQueue和LinkedBlockingQueue是Java并发容器中两个常用的阻塞队列实现,分别基于数组和链表存储元素。它们都继承自AbstractQueue类...
20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java中atomic包中的原子操作类...
- **线程安全的集合类**:如Vector、HashTable、Collections.synchronizedXXX() 方法产生的同步容器,以及CopyOnWriteArrayList 和 CopyOnWriteArraySet 等并发容器。 - **ConcurrentHashMap**:Java并发编程的...
2. **并发容器** - **并发集合**:包括线程安全的`Vector`、`Collections.synchronizedXXX`方法转换的同步集合,以及更高效的`ConcurrentHashMap`、`CopyOnWriteArrayList`等并发集合。 - **阻塞队列**:如`...
- **线程安全容器**:如Vector、Collections.synchronizedXXX()方法创建的容器,以及ConcurrentHashMap、CopyOnWriteArrayList等高效并发容器的使用。 - **并发队列**:如ArrayBlockingQueue、LinkedBlockingQueue...
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...
3. **并发容器** - **ConcurrentHashMap**:线程安全的哈希表,性能优于synchronized HashMap。 - **CopyOnWriteArrayList/CopyOnWriteArraySet**:写时复制策略,读操作无锁,适合读多写少的场景。 - **...
5. **并发容器** - `BlockingQueue`阻塞队列:实现生产者消费者模型,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。 - `ConcurrentHashMap`并发哈希表:线程安全的哈希表,性能优于`synchronized`修饰的`...
- **并发容器**:`BlockingQueue`接口及其实现,如`ArrayBlockingQueue`、`LinkedBlockingQueue`,常用于生产者-消费者模型。 4. **原子类** - `Atomic`系列类,如`AtomicInteger`、`AtomicLong`、`...
在Java的并发编程中,JDK提供的容器类库扮演了重要角色,其中`java.util.concurrent`包下的`BlockingQueue`接口及其实现类是多线程环境下数据同步的重要工具。本篇文章将深入探讨`LinkedBlockingQueue`,这是一个...
- **并发容器**:如ArrayList、HashMap的并发版本(CopyOnWriteArrayList、ConcurrentHashMap),设计为线程安全,但效率更高。 - **阻塞队列**:如ArrayBlockingQueue、LinkedBlockingQueue,提供生产者-消费者...
3. **并发容器** - `ConcurrentHashMap`:线程安全的哈希表,理解其分段锁的设计和操作流程。 - `Atomic`类:如`AtomicInteger`,提供原子操作,用于在不使用锁的情况下实现线程安全。 - `BlockingQueue`:阻塞...
2. **并发容器**:如`ConcurrentHashMap`、`BlockingQueue`(如`ArrayBlockingQueue`、`LinkedBlockingQueue`)等,这些容器在并发环境下提供高效且安全的数据共享机制。 3. **线程池**:`ExecutorService`和`...
7-1 同步容器与并发容器.mp4 7-2 同步容器.mp4 7-3 并发容器.mp4 7-4 LinkedBlockingQueue的使用及其源码探秘.mp4 8-1 CountDownLatch的使用及其源码探秘.mp4 8-2 CyclicBarrier的使用及其源码探秘.mp4 8-3 ...
7-1 同步容器与并发容器.mp4 7-2 同步容器.mp4 7-3 并发容器.mp4 7-4 LinkedBlockingQueue的使用及其源码探秘.mp4 8-1 CountDownLatch的使用及其源码探秘.mp4 8-2 CyclicBarrier的使用及其源码探秘.mp4 8-3 ...
7-1 同步容器与并发容器.mp4 7-2 同步容器.mp4 7-3 并发容器.mp4 7-4 LinkedBlockingQueue的使用及其源码探秘.mp4 8-1 CountDownLatch的使用及其源码探秘.mp4 8-2 CyclicBarrier的使用及其源码探秘.mp4 8-3 ...