Java ';同步';在内部对象上,例如gameloop.player1
我知道监视器是如何工作的,锁定对象,死锁等,但这对我来说还不清楚,我必须确定,我做的是正确的 假设我有一个对象Java ';同步';在内部对象上,例如gameloop.player1,java,multithreading,synchronized,Java,Multithreading,Synchronized,我知道监视器是如何工作的,锁定对象,死锁等,但这对我来说还不清楚,我必须确定,我做的是正确的 假设我有一个对象gameloop。 在该对象内部,我们必须对玩家进行操作:player1和player2 我的gameloop在同步的块中呈现、读取用户输入并修改player1和player2 我还有第二个线程,它通过网络监听数据包。 当玩家的位置信息包出现时,它必须将其写入玩家 我的问题来了: synchronized(gameloop.player2){ gameloop.player2.s
gameloop
。
在该对象内部,我们必须对玩家进行操作:player1
和player2
我的gameloop
在同步的块中呈现、读取用户输入并修改player1
和player2
我还有第二个线程
,它通过网络监听数据包。
当玩家的位置信息包出现时,它必须将其写入玩家
我的问题来了:
synchronized(gameloop.player2){
gameloop.player2.setX(packet.receivedX);
gameloop.player2.setY(packet.receivedY);
}
以上是否仅在player2
对象上阻止“同步”,或锁定整个gameloop(在这种情况下这是不好的)?
我不知道如何测试它,也找不到任何与“在内部对象上同步”相关的东西
谢谢 这将锁定gameloop.player2,这意味着任何其他同步块也将尝试锁定gameloop.player2,必须等待您发布的代码完成。当你需要更新player2时,你会想锁定player2,但只访问“gameloop”而不访问“synchronized”是安全的,对吧?我不知道你在访问gameloop时在做什么,所以我不能肯定。一般来说,无论何时修改变量或从中读取变量(除非它们是最终的且从未被修改),都应该锁定某个对象,该对象在访问/修改这些变量时始终处于锁定状态。您用来锁定的对象并不重要。例如,我有时会创建“object somethingLock=new object();”之类的对象,并在读取/修改“某物”时锁定该对象。上述代码仅在player2对象上同步。但您还提到gameloop`渲染…使用同步块修改player1和player2。您正在gameloop
中同步哪些对象?如果您在使用gameloop
修改player2状态时没有在player2对象上同步,那么您就有问题了。gameloop渲染,我的意思是它得到“player2”x和y,并使用它们进行绘制。它位于一个同步块中:synchronized(player2){draw(player2.getX(),player2.getY())}这是安全的,对吗?是的,这是安全的,因为您正在gameloop中的player2上同步。您可以使用Thread.holdsLock(gameloop.player2)或Thread.holdsLock(gameloop)进行测试。请参阅: