java集合之LinkedTransferQueue

LinkedTransferQueue是一个无界的阻塞队列,底层采用链表结构存储数据,遵循先进先出,但是它不采用加锁的方式来控制并发,而是采用cas和各种判断,来保证多线程的操作,它与SynchronousQueue一样,不存储元素,而是存储生产者或者消费者本身,也就是线程本身

生产者和消费者直接交换手中的数据,任何一个写操作必须等到一个读操作(反之亦然),交换成功才是成功,否则就阻塞或者返回失败(取决于调用的方法),队列中的元素必须是同一类角色,要么是生产者,要么是消费者

无论读取或者写入数据,都是通过xfer方法,所以重点方法也是xfer
在这里插入图片描述

1、内部类Node
static final class Node {
   
   
	// true-生产者  false-消费者
  	final boolean isData;   
  	// item在不同情况下效果不同
    // 生产者:有数据
    // 消费者:为null 
    volatile Object item; 
    // 下一个节点  
    volatile Node next;
    // 当前线程
    volatile Thread waiter; 
...
}
2、构造方法
   public LinkedTransferQueue() {
   
   
   }
   public LinkedTransferQueue(Collection<? extends E> c) {
   
   
       this();
       addAll(c);
   }
3、重要属性
	// 表示方法不阻塞 立刻返回 poll, tryTransfer
    private static final int NOW   = 0;
    // 表示线程不阻塞 offer, put, add 使用此参数
    private static final int ASYNC = 1; 
    // 当元素未匹配上,则阻塞,死等,直到匹配上为止 transfer, take使用此参数
    private static final int SYNC  = 2; 
    // 阻塞固定时间 poll, tryTransfer
    private static final int TIMED = 3; 
    // 队列头
    transient volatile Node head;
	// 队列尾
    private transient volatile Node tail;
4、写入方法
// 添加元素到队列 不阻塞
public void put(E e) {
   
   
    xfer(e, true, ASYNC, 0);
}
// 添加元素到队列 不阻塞 因队列无界
public boolean offer(E e, long timeout, TimeUnit unit) {
   
   
    xfer(e, true, ASYNC, 0);
    return true;
}
// 添加元素到队列 不阻塞
public boolean offer(E e) {
   
   
    xfer(e, true, ASYNC, 0);
    return true;
}
// 添加元素到队列 不阻塞
public boolean add(E e) {
   
   
   xfer(e, true, ASYNC, 0);
   return true;
}
// 添加元素到队列 不阻塞
public boolean tryTransfer(E e) {
   
   
   return xfer(e, true, NOW, 0) == null;
}
// 添加元素到队列 阻塞 未匹配则死等,直到匹配
public void transfer(E e) throws InterruptedException {
   
   
    if (xfer(e, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值