如果你有多個線程從讀取共享集(或任何非線程安全的變量),可能在同一時間被寫入(更新),那麼你需要它們同步。 Java 8將新的synchronizedSet
方法添加到Collections
(請參閱Collections.synchronizedSet)。在Java 8之前,您提供了自己的同步。有關創建Java 8的更多信息,請參閱documentation。
即使使用Websockets,也需要同步,因爲您已經定義了可同時由多個websocket
會話訪問的靜態數據(一個Set
)。實例數據(非靜態變量)不需要同步,因爲單線程模型可以保證類(同一個會話)中沒有兩個方法可以同時執行。關於每個Websocket會話的一個線程的信息可以在這個Oracle documentation中找到。具體而言,它說:
與servlet相反,WebSocket端點被多次實例化。容器爲其部署URI的每個連接創建一個端點實例。 每個實例是與唯一的一個連接相關聯。此行爲有助於保持每個連接的用戶狀態並簡化開發,因爲在任何給定時間只有一個線程正在執行端點實例的代碼。
因此,每個實例變量(非靜態)不需要特殊的同步。 Websockets保證單線程模型中的線程安全。但是,這不適用於這些實例之間的共享數據(靜態變量)。因爲它們可能在自己的線程中運行,所以您需要在適當的地方提供同步。
哇完美,謝謝! – Continuity8 2014-09-30 00:19:59