I struggled for a long time, failing the third condition. Finally passed with for-loop to run through the actions (including try/catch), and then after the loop, if (!OnlineGame.isWinnerFound) { OnlineGame.isWinnerFound = true; System.out.println(getName() + ":won!"); } Even so, if I give Gates and Smith the *same* rating, it says that both have won. How is this even possible?? So far as I can see, the only way this could happen is if both threads somehow find isWinnerFound false. PS. I thought it would work even without the check on the flag -- the winner should have forced the other two into their catch blocks. Poking around the answers to questions, it looks like something of the sort has worked for others. But that also allows both to win, and also failed validation. Thanks for any help you can give! Edit: After poking around on the web, I now see that the volatile variable might have the same value for different threads. Getting a single winner would have something to do with "synchronized" (which we haven't learned about yet). It appears that validation requires only that the flag definitely be false if we are going to declare anyone a winner. So the exercise allows ties!