首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在线程之间共享数据和强制锁

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

Stack Overflow用户
提问于 2013-07-15 11:01:53
回答 4查看 124关注 0票数 1

我和一个朋友正在制作一个游戏引擎,在这个引擎中,两个人工智能在互相战斗。我们试图设置游戏引擎线程,这样的方式,AI线程不能做的事情,如放慢游戏,或摧毁任何单位在任意等。

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

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

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

问题

如何锁定变量/共享数据,使您能够看到变量是否已锁定并强制锁定?还是有一个不涉及锁定的解决方案?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-15 11:07:22

要保证这一点,唯一的办法是让认可机构在一个中立区域共享信息,在那里,两个系统都没有对代码进行任何控制。通过这种方式,您可以使用同步、锁定或并发集合,但是由于人工智能都不能访问保存这些信息的代码,所以它们不能对彼此产生负面影响。我将确保锁不公开,并由共享存储控制。

票数 2
EN

Stack Overflow用户

发布于 2013-07-15 11:08:48

请务必始终从同步/锁/解锁上下文中读取/写入共享数据。

代码语言:javascript
运行
复制
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

它就像阿皮一样

代码语言:javascript
运行
复制
 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,哪一个最适合你需要。

票数 1
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17652704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档