b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

链表 结构 解读 Java 并发队列 BlockingQueue(10)

电脑杂谈  发布时间:2018-02-21 23:42:01  来源:网络整理

private final ReentrantLock lock;

// 这个很好理解,其实例由上面的 lock 属性创建

private final Condition notEmpty;

// 这个也是用于锁,用于数组扩容的时候,需要先获取到这个锁,才能进行扩容操作

// 其使用 CAS 操作

private transient volatile int allocationSpinLock;

// 用于序列化和反序列化的时候用,对于 PriorityBlockingQueue 我们应该比较少使用到序列化

private PriorityQueue q;

此类实现了 Collection 和 Iterator 接口中的所有接口方法,对其对象进行迭代并遍历时,不能保证有序性。如果你想要实现有序遍历,建议采用 Arrays.sort(queue.toArray()) 进行处理。PriorityBlockingQueue 提供了 drainTo 方法用于将部分或全部元素有序地填充(准确说是转移,会删除原队列中的元素)到另一个集合中。还有一个需要说明的是,如果两个对象的优先级相同(compare 方法返回 0),此队列并不保证它们之间的顺序。

PriorityBlockingQueue 使用了基于数组的二叉堆来存放元素,所有的 public 方法采用同一个 lock 进行并发控制。

二叉堆:一颗完全二叉树,它非常适合用数组进行存储,对于数组中的元素 a[i],其左子节点为 a[2i+1],其右子节点为 a[2i + 2],其父节点为 a[(i-1)/2],其堆序性质为,每个节点的值都小于其左右子节点的值。二叉堆中最小的值就是根节点,但是删除根节点是比较麻烦的,因为需要调整树。

简单用个图解释一下二叉堆,我就不说太多的严谨的术语了,这种数据结构的优点是一目了然的,最小的元素一定是根元素,它是一棵满的树,除了最后一层,最后一层的节点从左到右紧密排列。

下面开始 PriorityBlockingQueue 的源码分析,首先我们来看看构造方法:

// 默认构造方法,采用默认值(11)来进行初始化

public PriorityBlockingQueue() {

this(DEFAULT_INITIAL_CAPACITY, null);

}

// 指定数组的初始大小

public PriorityBlockingQueue(int initialCapacity) {

this(initialCapacity, null);

}

// 指定比较器

public PriorityBlockingQueue(int initialCapacity,

Comparator<? super E> comparator) {

if (initialCapacity < 1)

throw new IllegalArgumentException();

this.lock = new ReentrantLock();

this.notEmpty = lock.newCondition();

this.comparator = comparator;

this.queue = new Object[initialCapacity];

数据结构_链表 结构_二叉链表定义

}

// 在构造方法中就先填充指定的集合中的元素

public PriorityBlockingQueue(Collection<? extends E> c) {

this.lock = new ReentrantLock();


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-87792-10.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 贞元文士
      贞元文士

      我觉得iOS9其实挺好的

    • 卢泽轩
      卢泽轩

      #吴亦凡1106生日快乐##吴亦凡##吴亦凡BadGirl#吴亦凡新歌首唱BadGirl

    • 侯彭老
      侯彭老

      表明美国的死党已经不听他的话了

    每日福利
    热点图片
    拼命载入中...