Java静态变量实例是否在另一个实例中被覆盖?

时间:2014-04-25 15:57:46

标签: java multithreading variables static

我患有更复杂的问题。我有服务器程序,当服务器接受连接时,它创建新的套接字并在新线程中通过它进行通信。这个新线程创建了一个类'Protocol'的实例,类协议包含静态变量。

static Player player; 

此类包含初始化此播放器变量的方法。有代码示例

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

当第一个玩家加入时一切正常, 但是当第二个玩家加入服务器时,在他的线程(第二个线程)中调用此方法并创建新的协议实例,第一个线程中的变量Player包含新的播放器实例(在第二个线程中创建的实例)而不是在没有第二个线程时创建的实例线。

长话短说,所有新线程总是具有相同的Player实例,即使在每个线程中总是创建了Player的新实例。我是OOP的新手,也许我不能正确理解'静态'的含义。如果有人能解释一下,我会很高兴:-)。

2 个答案:

答案 0 :(得分:3)

static表示“在所有实例之间共享”。您的代码似乎有一些逻辑可以阻止同时创建三个以上的玩家。在这种情况下,将玩家分配到共享的static变量是不正确的。

您应该在班级中使Player非静态,或者至少使用thread-local storage for it。否则,Protocol的所有实例都将共享同一个播放器,无论它们运行的​​是什么线程。

答案 1 :(得分:2)

静态变量不是实例变量,对于每个实例都是相同的。它是一个类变量,所以如果某个实例触摸它,它将为所有变化。 您可以阅读有关静态变量here

的更多信息