2017-08-21 27 views
0

1つのクライアントがn個の異なるサーバーに接続しています。だから、私はn異なるチャネルを作成しています。
私のサーバーは5000以上です。私は、1つのイベントループグループで10個のイベントループを使用しています。また、各チャネルごとに別々のパイプラインがあります。
私は1つのイベントループを使用し、まだ10のイベントループで何も同時性の問題が発生していない場合、並行性の問題はないことを知っています。私の質問は
です。コードの下に、なぜ?
複数のイベントループがこれにアクセスしていないと、複数のイベントループを使用しているという点が何であるのでしょうか?Netty:複数のイベントループを使用する同時実行性の問題

ここ
@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だけIPを保存するためのHashSetを使用してhealthTargetsはシングルトンクラスです。

+0

スレッドバグは、通常散発的に発生するバグです。これらのバグは、報告されたときに再現することが通常困難です。スレッドの問題に関するインターフェイスのルールに従えば、安全でなければなりません – Ferrybig

答えて

1

異なるEventLoops間でSet(同じと思われる)の同じインスタンスを共有すると、問題が発生します。これは、異なるチャンネルが異なるEventLoopsで実行される可能性があり、Threadsのためです。これは、healthTargetsスレッドセーフのアクセスを行う必要があるという効果があります。

これは、他のマルチスレッドプログラムと違いはありません。

関連する問題