我对JAVA相当陌生,尤其是对并发性,因此可能/希望这是相当简单的问题。

基本上从我的主线程我有这个:

public void playerTurn(Move move)
{

  // Wait until able to move
  while( !gameRoom.game.getCurrentPlayer().getAllowMove() )
  {
    try {
      Thread.sleep(200);
      trace("waiting for player to be available");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  gameRoom.getGame().handle(move);
}


gameRoom.getGame()在其自己的线程上。
gameRoom.getGame()。handle()已同步
gameRoom.game.getCurrentPlayer()在gameRoom.getGame()的变量上,位于同一线程中

调用handle(move)时,allowMoves设置为false,并在完成处理移动后将其设置为true。

我多次调用playerTurn()。我实际上是从SmartFoxServer扩展程序调用它的,当它收到请求时,通常是快速连续的。

我的问题是,大多数情况下都可行。但是有时它会发出多个handle(move)调用,即使allowMoves应该为false。它不等待它再次成为真实。我认为游戏线程可能没有机会在调用另一个handle(move)之前设置allowMoves。我在allowMoves中添加了volatile,并确保将游戏线程上的功能设置为同步。但是问题仍然在发生。

这些在我的游戏课中:

synchronized public void handle(Object msg)
{
  lastMessage = msg;
  notify();
}

synchronized public Move move() throws InterruptedException
{
  while (true)
  {
   allowMoves = true;
   System.out.print(" waiting for move()...");
   wait();
   allowMoves = false;
   if (lastMessage instanceof Move)
   {
    System.out.print(" process move()...");
    Move m = (Move) lastMessage;
    return m;
   }
  }
}

public volatile boolean allowMoves;
synchronized public boolean getAllowMoves()
{
  return allowMoves;
}


正如我所说的,我对此并不陌生,可能比我领先(通常,但我的风格有点像是跳入最深的一面,无论如何对于快速学习都非常有用)。

为您的帮助加油。

最佳答案

不知道这是否有帮助,但是如果您使用AtomicBoolean代替synchronizedvolatile怎么办?它说是lock-free and thread-safe

10-08 11:13