concurrent包的数据结构

并发包数据结构解析
本文详细介绍了Java并发包中的各种数据结构,包括原子量、阻塞队列、非阻塞队列等,并深入探讨了它们的实现原理及应用场景。

concurrent包的数据结构:阻塞的结构都是用lock加锁(lock会休眠锁),非阻塞是用CAS直接for循环加入。

  • 结构简介
名称功能组成
原子量
AtomicBooleanUnsafe+==volatile int value==
AtomicIntegerUnsafe+==volatile int value==
AtomicIntegerArrayUnsafe+==final int[] array==
AtomicLongUnsafe+==volatile long value==
AtomicLongArrayUnsafe+==final int[] array==
名称功能组成
阻塞队列==继承:BlockingQueue接口==
ArrayBlockingQueue数组+lock
LinkedBlockingQueue链表+lock
PriorityBlockingQueue**(优先级队列)**自定义哪个队列先出数组+lock
DelayQueue (时间队列)队列中每个元素都有个过期时间,并且队列是个优先级队列,当从队列获取元素时候,只有过期元素才会出队列PriorityQueue(优先级队列)+lock
SynchronousQueue一个不存储元素的阻塞队列
阻塞队列(双端)==继承:BlockingDeque接口==
LinkedBlockingDeque(阻塞双端链表队列)链表+lock
非阻塞队列
ConcurrentLinkedDeque(非阻塞双端队列)添加线程不会休眠,一直for循环添加直到成功链表(UnSafe)
ConcurrentLinkedQueue(非阻塞队列)添加线程不会休眠,一直for循环添加直到成功链表(UnSafe)
其它容器
ConcurrentHashMap(非阻塞的hasMap)
DelayQueue:延时队列。
  • 队列中每个元素都有个过期时间,并且队列是个优先级队列,当从队列获取元素时候,只有过期元素才会出队列

  • 出队源码:会比较时间

public E poll() {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        E first = q.peek();
        if (first == null || first.getDelay(TimeUnit.NANOSECONDS) > 0)
            return null;
        else
            return q.poll();
    } finally {
        lock.unlock();
    }
}
  • 添加类:需要实现Delayed
'实现类'

public class TestDelay implements Delayed {

	@Override
	public int compareTo(Delayed o) {
		return 0;
	}

	@Override
	public long getDelay(TimeUnit unit) {
		return 0;
	}

}

'添加'

	BlockingQueue bq = new DelayQueue<>();
	bq.add(new TestDelay());
	
PriorityBlockingQueue:优先级队列
  • 核心源码
'弹出'
public E poll() {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        return dequeue();
    } finally {
        lock.unlock();
    }
}

'调用dequeue()'
private E dequeue() {
    int n = size - 1;
    if (n < 0)
        return null;
    else {
        Object[] array = queue;
        E result = (E) array[0];
        E x = (E) array[n];
        array[n] = null;
        Comparator<? super E> cmp = comparator;
        if (cmp == null)
            siftDownComparable(0, x, array, n);
        else
            siftDownUsingComparator(0, x, array, n, cmp);
        size = n;
        return result;
    }
}

'调用siftDownUsingComparator()'
private static <T> void siftDownUsingComparator(int k, T x, Object[] array,
                                                int n,
                                                Comparator<? super T> cmp) {
    if (n > 0) {
        int half = n >>> 1;
        while (k < half) {
            int child = (k << 1) + 1;
            Object c = array[child];
            int right = child + 1;
            if (right < n && cmp.compare((T) c, (T) array[right]) > 0)
                c = array[child = right];
            if (cmp.compare(x, (T) c) <= 0)
                break;
            array[k] = c;
            k = child;
        }
        array[k] = x;
    }
}
  • 使用:implements Comparator
'implements Comparator'
public class TestPrority implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {
		return 0;
	}

}

'添加'
BlockingQueue bq = new PriorityBlockingQueue<>();
bq.add(new TestPrority());

转载于:https://my.oschina.net/u/2246410/blog/1800728

### 关于并发数据结构 #### Java 中的并发数据结构 在Java中,`java.util.concurrent`提供了许多线程安全的数据结构。这些数据结构不仅能够保证线程安全性,而且通常还具有较好的性能表现[^1]。 - **ConcurrentHashMap**: 这是一个高度优化过的哈希表实现,在高竞争环境下也能保持良好的吞吐量。它允许任意数量的读取器并行工作以及有限数量的同时写入者。 ```java ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(); ``` - **CopyOnWriteArrayList**: 当列表主要用于遍历而很少发生更新的情况下非常有用。每次修改都会创建整个数组的新副本来确保迭代期间不会抛出 `ConcurrentModificationException`。 ```java List<String> list = new CopyOnWriteArrayList<>(); ``` - **BlockingQueue接口及其子类**: 提供了一个阻塞队列的概念,即当试图从空队列获取元素或向已满队列添加元素时会自动等待直到条件满足为止。常见的实现有`LinkedBlockingQueue`, `ArrayBlockingQueue`等。 ```java BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10); ``` #### Rust 的并发集合类型 Rust标准库同样提供了一些适用于多线程环境下的容器类型。为了减少锁争用带来的影响,Rust倾向于采用无锁算法来构建高效且可靠的共享状态管理机制[^2]。 - **Arc (Atomic Reference Counting)**: 实现了引用计数的对象封装,可以安全地跨多个所有权之间传递不可变数据;配合`Mutex`或者`RwLock`可获得互斥访问权限从而支持可变性操作。 ```rust use std::sync::{Arc, Mutex}; let counter = Arc::new(Mutex::new(0)); ``` - **DashMap**: 是第三方 crate 提供的一种高性能分布式 hash 表解决方案,相比原生 HashMap 更适合处理大规模并发场景下的键值存储需求。 #### 并发编程挑战注意事项 尽管上述提到的各种工具和技术可以在一定程度上简化并发程序的设计过程,但是正确运用它们仍然充满挑战。编写有效的并发应用程序可能涉及到复杂的状态同步逻辑、死锁预防措施以及其他潜在的风险因素[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值