2016-02-14 63 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