java中SynchronousQueue的原理

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

1.主要属性

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

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

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

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

2.构造方法

publicSynchronousQueue(){
this(false);
}
publicSynchronousQueue(booleanfair){
transferer=fair?newTransferQueue<E>():newTransferStack<E>();
}

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

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

3.TransferQueue

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

publicSynchronousQueue(booleanfair){
//如果是公平模式就使用队列,如果是非公平模式就使用栈
transferer=fair?newTransferQueue<E>():newTransferStack<E>();
}

原文来自:https://www.py.cn

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容