二,源码
1.内部类和成员变量
abstract static class Transferer<E> {
/**
*
* @param e 可以为null,null的时候表示这个是一个request类型的请求,
* 如果不是null,说明当前请求是一个data类型的请求
* @param timed true 表示指定了超时时间, false 表示不支持超时,直到匹配到为止
* @param nanos 超时限制 单位:纳秒
* @return E 如果当前请求是一个request类型的请求
* 返回值!=null 表示匹配成功
* 返回值==null 表示超时或者被中断
* 如果当前请求是data类型的请求,
* 返回值!=null 表示匹配成功,返回当前线程put的数据
* 返回值 ==null 表示data类型的请求超时 或者被中断
*/
abstract E transfer(E e, boolean timed, long nanos);
}
/**
* 表示获取当前系统所拥有的的cpu核心数
*/
static final int NCPUS = Runtime.getRuntime().availableProcessors();
/**
* 表示指定了超时时间的话,最大的自旋次数
* 为什么需要自旋操作?因为线程挂起唤醒站在cpu角度,是比较耗费资源的,
* 涉及到用户态和内核太的切换浪费性能,自旋期间线程会一直检查自己的
* 状态是否被匹配到,如果自旋期间被匹配到,直接返回,如果
* 未被匹配到,达到某一指标后,还是会挂起。
*/
static final int maxTimedSpins = (NCPUS < 2) ? 0 : 32;
/**
* 表示没有指定超时限制的时候,线程等待匹配时,自旋的次数。
*/
static final int maxUntimedSpins = maxTimedSpins * 16;
/**
* 如果请求是指定超时限制的话,如果超时参数小于1000纳秒的时候,禁止挂起
*/
static final long spinForTimeoutThreshold = 1000L;
2.非公平模式
TODO