1

rankedPlayersWaitingForMatchここにこのコード ブロックがあり、スレッド間で正しく同期されていることを確認する必要があります。使用するつもりでしたが、ステートメントsynchronizeで変数が使用されているため、ここでは機能しないと思います。if私はについてオンラインで読みましfinal Lock lock = new ReentrantLock();たが、この場合、try/finallyブロックで適切に使用する方法について少し混乱しています。簡単な例を得ることができますか? ありがとう

// start synchronization
if (rankedPlayersWaitingForMatch.get(rankedType).size() >= 2) {
  Player player1 = rankedPlayersWaitingForMatch.get(rankedType).remove();
  Player player2 = rankedPlayersWaitingForMatch.get(rankedType).remove();
  // end synchronization
  // ... I don't want this all to be synchronized, just after the first 2 remove()
} else {
  // end synchronization
  // ...
}
4

3 に答える 3

3

やりたいことは次のとおりです。

boolean has_players = false;
Player player1;
Player player2;
synchronize (rankedPlayersWaitingForMatch) {
  if (rankedPlayersWaitingForMatch.get(rankedType).size() >= 2) {
    player1 = rankedPlayersWaitingForMatch.get(rankedType).remove();
    player2 = rankedPlayersWaitingForMatch.get(rankedType).remove();
    has_players = true;
  }
}

if(has_players){
  // ... I don't want this all to be synchronized, just after the first 2 remove()
}
else{
  // ...
}
于 2013-07-01T16:19:24.920 に答える