二,源码

1.内部类和成员变量

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

2.非公平模式

TODO