我正在建模一个游戏,其中多个玩家(线程)同时移动。
玩家当前所在位置的信息被存储两次:玩家有一个变量“hostField”,它引用棋盘上的一个字段,每个字段都有一个 ArrayList 存储当前位于该字段的玩家。
我对拥有冗余信息这一事实不太满意,但我发现如果不循环遍历大数据集,就无法避免这种情况。
然而,当一名玩家从一个场地移动到另一个场地时,我想确保(1)冗余信息保持链接(2)目前没有其他人操纵该场地。
因此我需要做类似的事情
synchronized(player, field) {
// code
}
这是不可能的,对吧?
我应该怎么办? :)
一个简单的解决方案是
synchronized(player) {
synchronized(field) {
// code
}
}
但是,请确保您always以相同的顺序锁定资源以避免死锁。
请注意,在实践中,瓶颈是字段,因此字段上的单个锁定(或专用的公共锁定对象,正如 @ripper234 正确指出的那样)可能就足够了(除非您同时以其他冲突的方式操纵玩家) 。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)