java中SynchronousQueue的原理

2026-01-29 0 25,015

本教程操作环境:windows7系统、java10版,DELL G3电脑。

1.主要属性

// CPU的数量
static final int NCPUS = Runtime.getRuntime().availableProcessors();
// 有超时的情况自旋多少次,当CPU数量小于2的时候不自旋
static final int maxTimedSpins = (NCPUS < 2) ? 0 : 32;
// 没有超时的情况自旋多少次
static final int maxUntimedSpins = maxTimedSpins * 16;
// 针对有超时的情况,自旋了多少次后,如果剩余时间大于1000纳秒就使用带时间的LockSupport.parkNanos()这个方法
static final long spinForTimeoutThreshold = 1000L;
// 传输器,即两个线程交换元素使用的东西
private transient volatile Transferer transferer;

通过属性我们可以Get到两个点:

1)这个阻塞队列里面是会自旋的;

2)它使用了一个叫做transferer的东西来交换元素;

2.构造方法

public SynchronousQueue() {
this(false);
}
public SynchronousQueue(boolean fair) {
transferer = fair ? new TransferQueue() : new TransferStack();
}

1)默认使用非公平模式,也就是栈结构;

2)公平模式使用队列,非公平模式使用栈;

3.TransferQueue

TransferQueue是SynchronousQueue的公平策略实现类,它在内部维护了一个线程队列。

public SynchronousQueue(boolean fair) {
    // 如果是公平模式就使用队列,如果是非公平模式就使用栈
    transferer = fair ? new TransferQueue() : new TransferStack();
}

以上就是java中SynchronousQueue的原理,相信大家现在已经能够理解SynchronousQueue的队列长度为0和公平模式的应用的情况了,而TransferQueue是实现公平模式的要点。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:以上部本文内容由互联网用户自发贡献,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。投诉邮箱:3758217903@qq.com

ZhiUp资源网 java教程 java中SynchronousQueue的原理 https://www.zhiup.top/11027.html

相关