我患有更复杂的问题。我有服务器程序,当服务器接受连接时,它创建新的套接字并在新线程中通过它进行通信。这个新线程创建了一个类'Protocol'的实例,类协议包含静态变量。
static Player player;
此类包含初始化此播放器变量的方法。有代码示例
synchronized(pMap){
if (pMap==null || pMap.PlayerNumber>3)
return false;
player = pMap.createPlayer(Thread.currentThread().getId());
}
当第一个玩家加入时一切正常, 但是当第二个玩家加入服务器时,在他的线程(第二个线程)中调用此方法并创建新的协议实例,第一个线程中的变量Player包含新的播放器实例(在第二个线程中创建的实例)而不是在没有第二个线程时创建的实例线。
长话短说,所有新线程总是具有相同的Player实例,即使在每个线程中总是创建了Player的新实例。我是OOP的新手,也许我不能正确理解'静态'的含义。如果有人能解释一下,我会很高兴:-)。
答案 0 :(得分:3)
static
表示“在所有实例之间共享”。您的代码似乎有一些逻辑可以阻止同时创建三个以上的玩家。在这种情况下,将玩家分配到共享的static
变量是不正确的。
您应该在班级中使Player
非静态,或者至少使用thread-local storage for it。否则,Protocol
的所有实例都将共享同一个播放器,无论它们运行的是什么线程。
答案 1 :(得分:2)
静态变量不是实例变量,对于每个实例都是相同的。它是一个类变量,所以如果某个实例触摸它,它将为所有变化。 您可以阅读有关静态变量here
的更多信息