2016-02-14 61 views
1

假设我有4个目的,A,B,C和D.Java同步困境

  • 上的所有的方法是同步的。
  • 上B,C和d否方法是同步的。
  • 乙仅由甲
  • C由两个甲访问和B
  • d访问只由乙

accesed上的一个的方法可以从在同一时间不同的线程被调用。给定的场景是线程安全的吗?也就是说,是否所有对B,C和D的读写都对所有线程可见?

在此先感谢!

回答

3

因此,所有的访问来自A的同步方法开始,所有读取和A,B,C,和d的写入,而在A.锁定完成然后是的,这将使得这种安排线程安全的(只要内存访问是关心的,不能谈论业务逻辑)。

注意:你说的“物”,而不是“类”,所以我认为这是你的意思。例如,如果您有多个B实例,并且这些实例在多个A实例之间共享,那么这可能不再是线程安全的。线程访问的对象树必须与它们保持的锁相匹配。

+0

非常感谢!实质上,我有一个在其自己的线程上运行的UI,并调用一个同步的Controller。控制器是一个游戏引擎的游戏循环,所以它产生了一段独立的线程,在一段时间内调用控制器的同步handleTick方法。问题在于保存/加载游戏通过UI线程通过控制器访问游戏数据,而不是游戏循环线程。由于只有一个线程与游戏数据一起工作,我不确定它是否可以。再一次,非常感谢! –

+1

是的,如果整个游戏状态是由控制器“拥有”并专门访问的,那么您只需要同步控制器。 – Thilo