簡體   English   中英

Server EndPoint for WebSocket Java API中的易變變量?

[英]Volatile variables in Server EndPoint for WebSocket Java API?

查看網絡上的其他示例,當通過Java API for WebSocket創建服務器端點時,所有EndPoint實例之間的共享變量都定義為靜態,但不是易變的。 我想知道原因。

據我了解,打開websocket的客戶端將在服務器中創建一個新線程。 因此,為了線程安全,是否不應將EndPoint實例之間的共享變量定義為volatile

即代替:

@ServerEndpoint("/endpoint")
public class WebsocketEndPoint {
   private static Set<WebsocketEndPoint> endPoint = new CopyOnWriteArraySet<WebsocketEndPoint> ();

   @OnOpen
   public void onOpen(Session session, String message) {
...

這段代碼不是更好嗎?:

@ServerEndpoint("/endpoint")
public class WebsocketEndPoint {
   private static volatile Set<WebsocketEndPoint> endPoint = new CopyOnWriteArraySet<WebsocketEndPoint> ();

   @OnOpen
   public void onOpen(Session session, String message) {
...

如果某個變量被某個線程修改但可能被另一個線程讀取(並且沒有任何其他同步機制),則需要使用volatile關鍵字。

因此,問題是是否存在某種情況,其中某個線程將Set更改為另一個Set ,而另一個線程嘗試訪問它。 例如,如果某個線程執行此操作: endPoint = new HashSet<>() ,而其他線程執行此操作: endPoint.get(...) ,則是, Set應該是volatile

但是,如果不同的線程使用相同的Set實例,則endPoint引用不會更改,並且“有效地是最終的”。 在這種情況下,無需添加volatile關鍵字。

因此,簡短的答案是“取決於”,因為我們需要查看完整的示例以查看Set是否應該可變。 我確實要指出一件事-使用CopyOnWriteArraySet似乎有點奇怪,因為對集合的修改只會在修改線程的上下文中創建修改后的副本 (這就是寫時復制的意思)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM