diff --git a/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamChannelBootstrap.java b/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamChannelBootstrap.java
index 3d966154d2..0d46699459 100644
--- a/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamChannelBootstrap.java
+++ b/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamChannelBootstrap.java
@@ -33,15 +33,19 @@ import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;
import java.nio.channels.ClosedChannelException;
-import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
@UnstableApi
public final class Http2StreamChannelBootstrap {
private static final InternalLogger logger = InternalLoggerFactory.getInstance(Http2StreamChannelBootstrap.class);
+ @SuppressWarnings("unchecked")
+ private static final Map.Entry, Object>[] EMPTY_OPTION_ARRAY = new Map.Entry[0];
+ @SuppressWarnings("unchecked")
+ private static final Map.Entry, Object>[] EMPTY_ATTRIBUTE_ARRAY = new Map.Entry[0];
- private final Map, Object> options = new LinkedHashMap, Object>();
- private final Map, Object> attrs = new LinkedHashMap, Object>();
+ private final Map, Object> options = new ConcurrentHashMap, Object>();
+ private final Map, Object> attrs = new ConcurrentHashMap, Object>();
private final Channel channel;
private volatile ChannelHandler handler;
@@ -62,13 +66,9 @@ public final class Http2StreamChannelBootstrap {
throw new NullPointerException("option");
}
if (value == null) {
- synchronized (options) {
- options.remove(option);
- }
+ options.remove(option);
} else {
- synchronized (options) {
- options.put(option, value);
- }
+ options.put(option, value);
}
return this;
}
@@ -83,13 +83,9 @@ public final class Http2StreamChannelBootstrap {
throw new NullPointerException("key");
}
if (value == null) {
- synchronized (attrs) {
- attrs.remove(key);
- }
+ attrs.remove(key);
} else {
- synchronized (attrs) {
- attrs.put(key, value);
- }
+ attrs.put(key, value);
}
return this;
}
@@ -204,36 +200,29 @@ public final class Http2StreamChannelBootstrap {
});
}
- @SuppressWarnings("unchecked")
private void init(Channel channel) {
ChannelPipeline p = channel.pipeline();
ChannelHandler handler = this.handler;
if (handler != null) {
p.addLast(handler);
}
- synchronized (options) {
- setChannelOptions(channel, options);
- }
-
- synchronized (attrs) {
- for (Map.Entry, Object> e: attrs.entrySet()) {
- channel.attr((AttributeKey
*/
public abstract class AbstractBootstrap, C extends Channel> implements Cloneable {
+ @SuppressWarnings("unchecked")
+ static final Map.Entry, Object>[] EMPTY_OPTION_ARRAY = new Map.Entry[0];
+ @SuppressWarnings("unchecked")
+ static final Map.Entry, Object>[] EMPTY_ATTRIBUTE_ARRAY = new Map.Entry[0];
volatile EventLoopGroup group;
@SuppressWarnings("deprecation")
@@ -424,16 +428,6 @@ public abstract class AbstractBootstrap, C ext
}
}
- @SuppressWarnings("unchecked")
- static Map.Entry, Object>[] newAttrArray(int size) {
- return new Map.Entry[size];
- }
-
- @SuppressWarnings("unchecked")
- static Map.Entry, Object>[] newOptionArray(int size) {
- return new Map.Entry[size];
- }
-
@SuppressWarnings("unchecked")
private static void setChannelOption(
Channel channel, ChannelOption> option, Object value, InternalLogger logger) {
diff --git a/transport/src/main/java/io/netty/bootstrap/Bootstrap.java b/transport/src/main/java/io/netty/bootstrap/Bootstrap.java
index 7e3f478ae8..3822b43b0f 100644
--- a/transport/src/main/java/io/netty/bootstrap/Bootstrap.java
+++ b/transport/src/main/java/io/netty/bootstrap/Bootstrap.java
@@ -35,8 +35,6 @@ import io.netty.util.internal.logging.InternalLoggerFactory;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
-import java.util.Map;
-import java.util.Map.Entry;
/**
* A {@link Bootstrap} that makes it easy to bootstrap a {@link Channel} to use
@@ -258,8 +256,8 @@ public class Bootstrap extends AbstractBootstrap {
ChannelPipeline p = channel.pipeline();
p.addLast(config.handler());
- setChannelOptions(channel, options0().entrySet().toArray(newOptionArray(0)), logger);
- setAttributes(channel, attrs0().entrySet().toArray(newAttrArray(0)));
+ setChannelOptions(channel, options0().entrySet().toArray(EMPTY_OPTION_ARRAY), logger);
+ setAttributes(channel, attrs0().entrySet().toArray(EMPTY_ATTRIBUTE_ARRAY));
}
@Override
diff --git a/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java b/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java
index c0041936e2..a66fc30aa5 100644
--- a/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java
+++ b/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java
@@ -123,16 +123,16 @@ public class ServerBootstrap extends AbstractBootstrap, Object>[] currentChildOptions =
- childOptions.entrySet().toArray(newOptionArray(0));
- final Entry, Object>[] currentChildAttrs = childAttrs.entrySet().toArray(newAttrArray(0));
+ childOptions.entrySet().toArray(EMPTY_OPTION_ARRAY);
+ final Entry, Object>[] currentChildAttrs = childAttrs.entrySet().toArray(EMPTY_ATTRIBUTE_ARRAY);
p.addLast(new ChannelInitializer() {
@Override