Hi community, i changed the random implementation for dubbo, you can see as below.
Details This issue links to this pull request (https://github.com/apache/incubator-dubbo/pull/2433) A little change, replace Random with ThreadLocalRandom in LeastActiveLoadBalance and RandomLoadBalance. Use of ThreadLocalRandom rather than shared Random objects in concurrent programs will typically encounter much less overhead and contention. Use of ThreadLocalRandom is particularly appropriate when multiple tasks . Benchmark There are some attentions need to be noticed before benchmark. third-party dependency need use carefully. bugs fix need to trace from upstream repository. performance benchmark I have compared the three cases : Random,ThreadLocalRandom from JDK, ThreadLocalRandom from netty. @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) @Warmup(iterations = 3, time = 5) @Measurement(iterations = 3, time = 5) @Threads(50) @Fork(1) @State(Scope.Benchmark) public class RandomBenchmark { Random random = new Random(); @Benchmark public int random() { return random.nextInt(); } @Benchmark public int threadLocalRandom() { return ThreadLocalRandom.current().nextInt(); } @Benchmark public int nettyThreadLocalRandom() { return io.netty.util.internal.ThreadLocalRandom.current().nextInt(); } public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(RandomBenchmark.class.getSimpleName()) .build(); new Runner(opt).run(); } } and below is our benchmark result under 50 concurrency Benchmark Mode Cnt Score Error Units RandomBenchmark.nettyThreadLocalRandom avgt 3 160.321 ?? 83.518 ns/op RandomBenchmark.random avgt 3 3281.972 ?? 2093.187 ns/op RandomBenchmark.threadLocalRandom avgt 3 91.505 ?? 39.702 ns/op From the result we can know the truth Both the performance (according to above benchmark) and the stability??it is from the JDK?? JDK 's ThreadLocalRandom looks good.
