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,

最低0.47元/天 解锁文章
3057

被折叠的 条评论
为什么被折叠?



