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