我和一个朋友正在制作一个游戏引擎,在这个引擎中,两个人工智能在互相战斗。我们试图设置游戏引擎线程,这样的方式,AI线程不能做的事情,如放慢游戏,或摧毁任何单位在任意等。
我们面临的问题是我们需要在游戏引擎和人工智能之间共享数据,直到现在我们使用了synchronize
,但是AI只会阻塞变量,游戏引擎就不能继续了。或者AI可以选择不同步和崩溃游戏,这也不是我们想要的。
我们一直在研究Lock的实现,但这似乎是假设AI会在使用之前检查变量是否被锁定,这当然是一个糟糕的AI无法做到的。
如果我们的数据被锁定,我们想要做的是查看一个可预测的时间。如果它是锁定的,我们取消AI的资格。否则我们就继续比赛。同步的问题是,进程是默认的,游戏引擎将等待,直到变量被解锁,并且可能挂起。
问题
如何锁定变量/共享数据,使您能够看到变量是否已锁定并强制锁定?还是有一个不涉及锁定的解决方案?
发布于 2013-07-15 11:07:22
要保证这一点,唯一的办法是让认可机构在一个中立区域共享信息,在那里,两个系统都没有对代码进行任何控制。通过这种方式,您可以使用同步、锁定或并发集合,但是由于人工智能都不能访问保存这些信息的代码,所以它们不能对彼此产生负面影响。我将确保锁不公开,并由共享存储控制。
发布于 2013-07-15 11:08:48
请务必始终从同步/锁/解锁上下文中读取/写入共享数据。
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
它就像阿皮一样
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,..Check,哪一个最适合你需要。
发布于 2013-07-15 11:08:22
查看接口Lock及其实现:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html
另外,阅读java.util.concurrent.locks包的文档:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/package-summary.html
https://stackoverflow.com/questions/17652704
复制相似问题