簡體   English   中英

實例的Java靜態變量是否在另一個實例中被覆蓋?

[英]Java Static Variable of instance overwritten in another instance ?

我患有更復雜的問題。 我有服務器程序,當服務器接受連接時,它將創建新的套接字並在新線程中進行通信。 這個新線程創建了一個類'Protocol'的實例,並且類協議包含靜態變量。

static Player player; 

此類包含其中初始化播放器變量的方法。 有代碼示例

synchronized(pMap){
    if (pMap==null || pMap.PlayerNumber>3)
        return false;
    player = pMap.createPlayer(Thread.currentThread().getId());
}

當第一個玩家加入時一切正常,但是當第二個玩家加入服務器時,在其線程(第二個線程)中調用此方法並創建新的協議實例,第一個線程中的變量Player會包含玩家的新實例(在第二個線程中創建的實例)沒有第二個線程時創建的實例的實例。

簡而言之,所有新線程始終具有相同的Player實例,即使在每個線程中始終都創建了Player的新實例。 我是OOP的新手,也許我無法正確理解“靜態”的含義。 如果有人可以解釋一下,我會很高興的:-)。

static表示“在所有實例之間共享”。 您的代碼似乎具有某種邏輯,可以防止同時創建三個以上的播放器。 在這種情況下,將玩家分配給共享的static變量是不正確的。

您應該在類中將Player非靜態,或者至少使用它在線程本地存儲 否則, Protocol所有實例都將共享同一播放器,而不管它們運行在哪個線程上。

靜態變量不是實例變量,每個實例都相同。 它是一個類變量,因此如果某個實例觸摸到它,則所有變量都會改變。 您可以在此處閱讀有關靜態變量的更多信息

暫無
暫無

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

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