Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ';同步';在内部对象上,例如gameloop.player1_Java_Multithreading_Synchronized - Fatal编程技术网

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)进行测试。请参阅: