我有一个客户端连接到n个不同的服务器。所以,我创造了不同的渠道
因为我的服务器超过5000.我使用10个事件循环,只有一个事件循环组。此外,每个通道都有单独的管道。
我已经知道如果我将使用一个事件循环并且我还没有在10个事件循环上看到任何并发问题,那么就不会出现并发问题。我的问题是:
我将在下面的代码中的healthTargets.storeHealthyTarget(InetAddress.getByName(remoteAddress));
行上出现并发问题吗?为什么?
我怀疑会出现并发问题。因为如果多个事件循环没有访问它,那么使用多个事件循环有什么意义呢?
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws UnknownHostException {
if(channelHandlerContext.channel().remoteAddress() != null)
{
String remoteAddress = remoteAddress(channelHandlerContext.channel().remoteAddress().toString());
if (httpObject instanceof HttpResponse) {
HttpResponseStatus responseStatus = ((HttpResponse)httpObject).getStatus();
if (responseStatus.code() == HttpResponseStatus.OK.code())
{
healthTargets.storeHealthyTarget(InetAddress.getByName(remoteAddress));
}
}
}
}
这里healthTargets.storeHealthyTarget
只是使用HashSet来存储ip,而healthTargets是一个单例类。
答案 0 :(得分:1)
如果您在不同的EventLoops之间共享Set
(您似乎在做)的相同实例,则会遇到问题。这是因为不同的Channel可以在不同的EventLoops和Threads上运行。这会导致您需要访问healthTargets
线程安全的访问权限。
这与任何其他多线程程序没有什么不同。