Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 在线程之间共享数据和强制锁定_Java_Multithreading_Synchronization_Locking_Game Engine - Fatal编程技术网

Java 在线程之间共享数据和强制锁定

Java 在线程之间共享数据和强制锁定,java,multithreading,synchronization,locking,game-engine,Java,Multithreading,Synchronization,Locking,Game Engine,我和一个朋友正在制作一个游戏引擎,其中两个AI在互相攻击。我们正在尝试设置游戏引擎线程,使AI线程无法执行诸如减慢游戏速度或随意摧毁任何单位等操作 我们面临的问题是,我们需要在游戏引擎和人工智能之间共享数据。到目前为止,我们使用了同步,但是AI可以阻止变量,游戏引擎无法继续。或者人工智能可以选择不同步和崩溃游戏,这也不是我们想要的 我们一直在研究Lock的实现,但这似乎是假设AI在使用之前会检查变量是否被锁定,而一个坏的AI当然不能做到这一点 如果数据被锁定,我们希望看到一个可预测的时间。如果它

我和一个朋友正在制作一个游戏引擎,其中两个AI在互相攻击。我们正在尝试设置游戏引擎线程,使AI线程无法执行诸如减慢游戏速度或随意摧毁任何单位等操作

我们面临的问题是,我们需要在游戏引擎和人工智能之间共享数据。到目前为止,我们使用了
同步
,但是AI可以阻止变量,游戏引擎无法继续。或者人工智能可以选择不同步和崩溃游戏,这也不是我们想要的

我们一直在研究Lock的实现,但这似乎是假设AI在使用之前会检查变量是否被锁定,而一个坏的AI当然不能做到这一点

如果数据被锁定,我们希望看到一个可预测的时间。如果它被锁定,我们将取消AI的资格。否则我们继续比赛。synchronized的问题是继续是默认的,并且游戏引擎将等待直到变量解锁并且可能挂起

问题


如何锁定变量/共享数据,以便查看变量是否已锁定并强制锁定?或者有没有不涉及锁定的解决方案?

保证这一点的唯一方法是让AIs在一个中立的区域共享信息,在这个区域中,两个系统都无法控制代码。通过这种方式,您可以使用synchronized、Lock或并发集合,但由于两种AI都无法访问保存此信息的代码,因此它们不能相互产生负面影响。我会确保锁定不会公开,并且由共享存储控制。

查看接口锁定及其实现:


另外,请阅读java.util.concurrent.locks包的文档:

请务必从同步/锁定/解锁上下文读取/写入共享数据 只是

是的,你能做到。使用ReentrantLock。

它具有类似Api的特性

 boolean tryLock(); // it will return true if lock available else false

 boolean tryLock(long time, TimeUnit unit) // same as above but will wait for the time 
     // you specify and and also can be interrupted.

像ReadWriteLock这样的锁有更多的味道。检查哪种最适合你的要求。

我不确定你的确切要求是什么;但是,您可以只在“游戏引擎”线程中完成与“游戏引擎”相关的所有操作。这是一个类似于UI线程的概念。在UI线程中,长时间运行的进程在后台线程中完成;但是,当用户界面需要更新时,后台线程需要向用户界面线程提交/发布更改,然后用户界面线程自己进行更改。

请参阅,它可能提供足够的功能满足您的要求。请参阅。我不知道这个项目是否是最新的,但我想你可能会发现它很有用。哇,谢谢所有的答案,大家,我们正在研究它们。@Tommos不要忘记接受一个对你有帮助的答案。
 boolean tryLock(); // it will return true if lock available else false

 boolean tryLock(long time, TimeUnit unit) // same as above but will wait for the time 
     // you specify and and also can be interrupted.