只有一个线程正在写入时线程安全

时间:2013-07-06 12:38:01

标签: java multithreading

我知道如果两个线程正在写入同一个地方我需要确保它们以安全的方式执行它并且不会导致任何问题,但是如果只有一个线程读取并完成所有写入而另一个线程正在读取。

在我的情况下,我第一次在小游戏中使用一个线程来保持更新与渲染不同。执行所有渲染的类永远不会写入它读取的任何内容,所以我不确定是否需要处理它们共享的所有内容的每次读写操作。

我会采取正确的步骤,以确保渲染器不会尝试读取任何不再存在的东西,但在调用播放器和实体的吸气剂之类的东西时,我应该以同样的方式处理它们吗?或者将像x,y cords和Booleans这样的值设置为像volatile一样“挥动”吗?

我的理解在这方面变得非常模糊,可以用一些有启发性的

编辑:共享数据将是需要绘制和移动并存储在对象列表中的任何内容。 例如玩家和其他实体;

2 个答案:

答案 0 :(得分:2)

使用给定的信息无法准确指定解决方案,但很明显,您需要某种方法来在线程之间进行同步。问题是,只要写操作不是 atomic ,您就可以在更新时读取数据。这意味着您例如使用新的x坐标获得旧的y坐标。

基本上你只需要担心同步,如果两个线程只是读取信息,或者 - 甚至更好 - 如果所有数据结构都是不可变的(因此两个线程都不能< / em>修改对象)。最好的方法是先考虑哪些操作需要原子化,然后创建一个解决方案来使操作成为原子。

不要忘记:让它工作,做对,优化(按顺序)。

答案 1 :(得分:0)

如果列表的大小是可变的并且您没有同步对它们的访问权限,则在这种情况下可能会遇到问题,请考虑以下事项:

  • 只读线程读取mySharedList大小,它看到它是15;在那一刻,它的CPU时间结束,读写线程被赋予CPU
  • 读写线程从列表中删除一个元素,现在它的大小为14。
  • 只读线程再次被授予CPU时间,它尝试使用在被中断之前读取的(现在过时的)大小读取最后一个元素,你将有一个例外。