我对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代替synchronized
和volatile
怎么办?它说是lock-free and thread-safe
。