[英]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.