cc: @nmittler & @normanmaurer
 Why not use a CHMv8 here? It seems the original concern was `AddressResolver` instantiation cost, but that's what `computeIfAbsent` is for. This would let us remove all the synchronized blocks.
 Because it's java8 only... Will fix the race though

> Am 03.02.2016 um 23:09 schrieb Stephane Landelle notifications@github.com:
> 
> Why not use a CHMv8 here? It seems the original concern was AddressResolver instantiation cost, but that's what computeIfAbsent is for. This would let us remove all the synchronized blocks.
> 
> —
> Reply to this email directly or view it on GitHub.
 @normanmaurer I'm referring to your internal fork: https://github.com/netty/netty/blob/4.1/common/src/main/java/io/netty/util/internal/chmv8/ConcurrentHashMapV8.java
 @trustin WDYT?

> Am 04.02.2016 um 08:08 schrieb Stephane Landelle notifications@github.com:
> 
> @normanmaurer I'm referring to your internal fork: https://github.com/netty/netty/blob/4.1/common/src/main/java/io/netty/util/internal/chmv8/ConcurrentHashMapV8.java
> 
> —
> Reply to this email directly or view it on GitHub.
 Fixed by https://github.com/netty/netty/pull/4844

Race in AddressResolverGroup
https://github.com/netty/netty/blob/4.1/resolver/src/main/java/io/netty/resolver/AddressResolverGroup.java

Here, `resolvers` is synchronized when calling .get(), but not in the future callback `resolvers.remove(executor);`

resolver/src/main/java/io/netty/resolver/AddressResolverGroup.java
resolver/src/main/java/io/netty/resolver/AddressResolverGroup.java
diff --git a/resolver/src/main/java/io/netty/resolver/AddressResolverGroup.java b/resolver/src/main/java/io/netty/resolver/AddressResolverGroup.java
index 89b00dfa044..509475eb3ea 100644
--- a/resolver/src/main/java/io/netty/resolver/AddressResolverGroup.java
+++ b/resolver/src/main/java/io/netty/resolver/AddressResolverGroup.java
@@ -73,7 +73,9 @@ public AddressResolver<T> getResolver(final EventExecutor executor) {
                 executor.terminationFuture().addListener(new FutureListener<Object>() {
                     @Override
                     public void operationComplete(Future<Object> future) throws Exception {
-                        resolvers.remove(executor);
+                        synchronized (resolvers) {
+                            resolvers.remove(executor);
+                        }
                         newResolver.close();
                     }
                 });
