2014-09-29 26 views
1

在我的WebSocket應用程序中,我有包含在會話之間共享的數據的集合 - 每個會話都可以訪問集合中的所有數據。我通過簡單地設置靜態來做到這一點。WebSocket會話之間共享的所有成員應該同步嗎?

我從網上閱讀的理解是,WebSockets(在我的情況下運行在Tomcat 8上)遵循單線程模型,因爲每個會話都有一個單獨的線程。所以...

我的問題是; 我應該讓共享成員同步,因爲它們可以通過任何WebSocket線程訪問?

或者WebSockets照顧這對我嗎?

我假設我應該同步一切共享,但只是確認!謝謝。

回答

2

如果你有多個線程讀取共享集(或任何非線程安全的變量),可能在同一時間被寫入(更新),那麼你需要它們同步。 Java 8將新的synchronizedSet方法添加到Collections(請參閱Collections.synchronizedSet)。在Java 8之前,您提供了自己的同步。有關創建Java 8的更多信息,請參閱documentation

即使使用Websockets,也需要同步,因爲您已經定義了可同時由多個websocket會話訪問的靜態數據(一個Set)。實例數據(非靜態變量)不需要同步,因爲單線程模型可以保證類(同一個會話)中沒有兩個方法可以同時執行。關於每個Websocket會話的一個線程的信息可以在這個Oracle documentation中找到。具體而言,它說:

與servlet相反,WebSocket端點被多次實例化。容器爲其部署URI的每個連接創建一個端點實例。 每個實例與唯一的一個連接相關聯。此行爲有助於保持每個連接的用戶狀態並簡化開發,因爲在任何給定時間只有一個線程正在執行端點實例的代碼。

因此,每個實例變量(非靜態)不需要特殊的同步。 Websockets保證單線程模型中的線程安全。但是,這不適用於這些實例之間的共享數據(靜態變量)。因爲它們可能在自己的線程中運行,所以您需要在適當的地方提供同步。

+0

哇完美,謝謝! – Continuity8 2014-09-30 00:19:59