共享数据并强制线程之间的锁定

时间:2013-07-15 11:01:54

标签: java multithreading synchronization locking game-engine

一位朋友和我正在制作一个游戏引擎,其中两个AI正在互相争斗。我们试图以这样的方式设置游戏引擎线程,即AI线程不能做任何事情,比如减慢游戏速度,或随意破坏任何单元等。

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

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

我们想要做的是查看我们的数据被锁定时的可预测时间。如果它被锁定,我们将取消AI的资格。否则我们继续游戏。同步的问题是,进程是默认值,游戏引擎将等到变量解锁并且可能挂起。

问题

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

4 个答案:

答案 0 :(得分:2)

保证这一点的唯一方法是让AI在中立区域共享信息,而中立区域中任何一个系统都无法控制代码。这样您就可以使用synchronized或Lock或并发集合,但由于AI都无法访问保存此信息的代码,因此它们不会对彼此产生负面影响。我会确保锁定不会暴露,并由共享存储控制。

答案 1 :(得分:1)

请注意,请务必从同步/锁定/解锁上下文中读取/写入共享数据 只要。

What we would like to do is look at a predictable time if our data is locked.

是的,你可以这样做。使用ReentrantLock。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html

它有像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的锁定。请检查最适合您的要求。

答案 2 :(得分:0)

答案 3 :(得分:0)

我不确定您的具体要求是什么;但是,您可以将与“游戏引擎”相关的所有内容仅在“游戏引擎”主题中完成。它与UI线程类似。在UI线程中,长时间运行的进程在后台线程中完成;然而,当UI需要更新时,后台线程需要将更改提交/发布到UI线程,然后自己进行更改。

相关问题