Java статическая переменная экземпляра перезаписана в другом экземпляре?

1

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. Я новичок в ООП, возможно, я не понимаю правильно значение "статический". Я был бы рад, если бы кто-нибудь мог это объяснить :-).

  • 6
    Вы действительно не правильно понимаете static . Есть много постов ее объяснения , что static средства.
  • 1
    С точки зрения непрофессионалов, статические средства; связано с классом. Существует только 1 из каждого класса (но их может быть много экземпляров класса или объектов определенного класса)
Показать ещё 2 комментария
Теги:
multithreading
variables
static

2 ответа

3
Лучший ответ

static средства "разделяются между всеми экземплярами". Похоже, что ваш код имеет некоторую логику, которая предотвращает создание более трех игроков одновременно. В этом случае неверно назначать игроков общей static переменной.

Вы должны сделать Player нестационарным в своем классе или, по крайней мере, использовать для него локальное хранилище потоков. В противном случае все экземпляры вашего Protocol будут делиться одним и тем же игроком, независимо от потока, на котором они запускаются.

  • 0
    я не думаю, что это хорошая идея, чтобы предложить использовать локальное хранилище потоков для тех, кто не может понять, что такое static : \
2

статическая переменная не является переменной экземпляра, ее одинаковой для каждого экземпляра. его переменная класса, поэтому, если какой-то экземпляр коснется ее, она изменится для всех. вы можете узнать больше о статических переменных здесь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню