2012-11-17 88 views
3

我正在製作一個2人視頻遊戲,並且在線程中oponent的位置得到更新,因爲它有一個持續監聽的套接字。我想分享的是位置和輪換。java - 在線程之間共享數據 - 原子參考或同步

由於這是一個視頻遊戲,我不希望主線程被阻塞(或者只是最短的時間),我不希望性能受到影響。因此,從我所看到分享這一信息正常的事情會是這樣的

class sharedinfo 
{ 
    public synchronized read(); 
    public synchronized write(); 
} 

但是這將阻止,直到三個值(即繪製視頻遊戲相同)在主線程讀取(或者將來會有更多的信息被寫入)被寫入,並且我讀過同步代碼非常昂貴(同樣重要的是這款遊戲也適用於android,因此性能非常重要)。

但我在想,也許有一個AtomicReference內的sharedInfo和消除同步會使它更有效率,因爲它只會停止時引用本身正在更新(寫不會存在,我會創建一個新的對象和把它放在atomicreference上),他們也說atom *使用硬件操作,並且比同步更有效率。

您認爲如何?

回答

1

考慮爲此使用隊列,Java有一些很好的併發隊列實現。查找java.util.concurrent中的BlockingQueue接口,以及實現它的人員。你有機會填補你甚至沒有考慮過的實施策略。

你知道它之前,你會想溝通比你的線程之間公正立場,與隊列,你可以在那裏堅持不同類型的對象,也許在不同的優先級等

如果你的儘可能使用接口(如Queue或BlockingQueue)的代碼(即,除特定實例構造位置以外的任何地方),如果需要不同的功能,則可以很容易地更換正在使用的確切類型的Queue,或者只是想玩。

+0

我曾考慮過使用隊列,我認爲這很適合發送像「我完成了遊戲」,「我使用過這個/那個能力」這樣的「事件」,但是對於這個職位你只是擔心最後的發送位置,所以我在想,如果一個玩家比另一個玩家擁有更強的處理能力,那麼它可能會淹沒另一個玩家。即使你注意不要淹沒你的對手,我認爲它可能會浪費資源到你更新邏輯的地方,並且不得不提取6或8或者任何位置/角度元素,只使用最後一個。我的推理是否正確? – dyeray

+0

我認爲你正在提出一些非常有效的問題。對於大多數人來說,有一種類型的隊列可以實現它,比如有限的隊列可以處理你所關心的舊更新的數量,阻塞或者非阻塞來處理洪泛......無論你選擇什麼,我都會建議你寫一個很少有單元測試可以啓動多個線程並且相互投擲東西。然後你可以玩不同的選項,看看他們的表現如何。如果您對Java中的併發編程感興趣,請閱讀Brian Goetz編寫的「Java併發實踐」一書。如果你不得不偷,它是很好的。 –