我知道监视器的工作方式,锁定对象,死锁等,但这对我来说还不清楚,我必须确定自己做得正确。

假设我有一个对象gameloop
在该对象内,我们需要玩家:player1player2

我的gameloop渲染,读取用户的输入并修改player1块中的player2synchronized

我还有第二个Thread,它通过网络监听数据包。
当玩家的位置数据包到来时,它必须将其写入玩家。

这是我的问题:

synchronized(gameloop.player2){
    gameloop.player2.setX(packet.receivedX);
    gameloop.player2.setY(packet.receivedY);
}


上面是否仅在player2对象上阻止了“同步”,还是锁定了整个游戏循环(在这种情况下会很糟糕)?
我不知道如何测试它,也找不到与“内部对象同步”有关的任何东西。

谢谢!

最佳答案

这将锁定gameloop.player2,这意味着任何其他尝试锁定gameloop.player2的同步块也必须等到您发布的代码完成。每当需要更新player2时,您都想锁定player2

08-18 03:28