Im страдает от более сложной проблемы. У меня есть серверная программа, когда сервер принимает соединение, он создает новый сокет и передает его в новый поток. Этот новый поток создает экземпляр класса "Протокол", а протокол класса содержит статическую переменную.
static Player player;
Этот класс содержит метод, в котором эта переменная игрока инициализируется. Существует пример кода
synchronized(pMap){
if (pMap==null || pMap.PlayerNumber>3)
return false;
player = pMap.createPlayer(Thread.currentThread().getId());
}
Когда первый игрок присоединяется ко всему, все работает нормально, но когда второй игрок присоединяется к серверу, вызывает этот метод в своем потоке (2-й поток) и создает новый экземпляр протокола, переменная Player в 1-м потоке объединяет новый экземпляр игрока (экземпляр, созданный во втором потоке) вместо созданный, когда не было второго потока.
Короче говоря, все новые потоки всегда имеют один и тот же экземпляр Player, даже если в каждом потоке всегда создается новый экземпляр Player. Я новичок в ООП, возможно, я не понимаю правильно значение "статический". Я был бы рад, если бы кто-нибудь мог это объяснить :-).
static
средства "разделяются между всеми экземплярами". Похоже, что ваш код имеет некоторую логику, которая предотвращает создание более трех игроков одновременно. В этом случае неверно назначать игроков общей static
переменной.
Вы должны сделать Player
нестационарным в своем классе или, по крайней мере, использовать для него локальное хранилище потоков. В противном случае все экземпляры вашего Protocol
будут делиться одним и тем же игроком, независимо от потока, на котором они запускаются.
static
: \
статическая переменная не является переменной экземпляра, ее одинаковой для каждого экземпляра. его переменная класса, поэтому, если какой-то экземпляр коснется ее, она изменится для всех. вы можете узнать больше о статических переменных здесь
static
. Есть много постов ее объяснения , чтоstatic
средства.