ForkjoinPool的ctl变量初始化赋值解析
private static final int AC_SHIFT = 48;
private static final long AC_MASK = 0xffffL << AC_SHIFT;
private static final int TC_SHIFT = 32;
private static final long TC_MASK = 0xffffL << TC_SHIFT;
long np = (long)(-parallelism); // offset ctl counts
this.ctl = ((np << AC_SHIFT) & AC_MASK) | ((np << TC_SHIFT) & TC_MASK);
np是构造forkjoinpool使用的并发值的相反数
假设parallelism=7
np= -7 = 0xffff ffff ffff fff9
ctl=(np<<48) & (0xffff <<48) | (np<<32) & (0xffff <<32)
fff9 0000 0000 0000 &
ffff 0000 0000 0000
第一部分取np的低16位作为ctl高16位
ffff fff9 0000 0000 &
0000 ffff 0000 0000
第二部分取np的低16位作为ctl的高17-32位
不管是前16位还是之后的16位,它们的值在加上parallelism后都会进位溢出。
达到了parallelism的语义:并发级别设置