4.0.19 ftl

As discussed, this is a separate pull request for the FastThreadLocal changes. I've made some minor tweaks, which are open to some discussion: I simplified the default bytebuf allocator changes so that they are cleaner, but the result is a very slight penalty to non-default bytebuf allocators, however the default allocator sees an ~30% increase in throughput in the microbenchmark, so it might be worth figuring out a way to deliver these benefits to user instantiated bytebuf allocators.

Some numbers for bytebufs...

4.0.19:
Benchmark                                                    (size)   Mode   Samples         Mean   Mean error    Units
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    00000  thrpt        20     9021.907      111.818   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    00256  thrpt        20     9186.624      100.175   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    01024  thrpt        20     9115.938      145.644   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    04096  thrpt        20    10207.567       61.943   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    16384  thrpt        20     8902.079      105.597   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    65536  thrpt        20     9655.586       80.938   ops/ms

4.0.19-ftl:
Benchmark                                                    (size)   Mode   Samples         Mean   Mean error    Units
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    00000  thrpt        20     8900.469      285.116   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    00256  thrpt        20     8668.458      156.805   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    01024  thrpt        20     9420.245      121.068   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    04096  thrpt        20     9542.702       66.353   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    16384  thrpt        20     9386.504       72.600   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.pooledDirectAllocAndFree    65536  thrpt        20     9164.332      106.697   ops/ms

Benchmark                                                           (size)   Mode   Samples         Mean   Mean error    Units
i.n.m.b.ByteBufAllocatorBenchmark.defaultPooledDirectAllocAndFree    00000  thrpt        20    12681.382       89.749   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.defaultPooledDirectAllocAndFree    00256  thrpt        20    12552.560       65.338   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.defaultPooledDirectAllocAndFree    01024  thrpt        20    12226.540      414.590   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.defaultPooledDirectAllocAndFree    04096  thrpt        20    12073.092      415.919   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.defaultPooledDirectAllocAndFree    16384  thrpt        20    13053.144      107.050   ops/ms
i.n.m.b.ByteBufAllocatorBenchmark.defaultPooledDirectAllocAndFree    65536  thrpt        20    12507.613      133.407   ops/ms

And some numbers of recyclable array list....

4.0.19:
Benchmark                                                (size)   Mode   Samples         Mean   Mean error    Units
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    00000  thrpt        20    96493.439      363.794   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    00256  thrpt        20    95397.559     1131.113   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    01024  thrpt        20    94684.792     1868.593   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    04096  thrpt        20    95421.467     1140.417   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    16384  thrpt        20    93655.506     1401.171   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    65536  thrpt        20    94552.290      974.530   ops/ms

4.0.19-ftl:
Benchmark                                                (size)   Mode   Samples         Mean   Mean error    Units
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    00000  thrpt        20   110474.911     2336.413   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    00256  thrpt        20   104353.207      867.748   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    01024  thrpt        20   106233.236     2464.719   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    04096  thrpt        20   101373.628     3747.072   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    16384  thrpt        20    97362.769     2540.927   ops/ms
i.n.m.i.RecyclableArrayListBenchmark.recycleSameThread    65536  thrpt        20   106652.754     1570.151   ops/ms


Couldn't we somehow also do something smart here to gain the same perf then when the DEFAULT is used?