Раньше я использовал HashMap, например
public Map<SocketChannel, UserProfile> clients = new HashMap<SocketChannel, UserProfile>();
теперь я переключился на ConcurrentHashMap, чтобы избежать синхронизированных блоков, и теперь у меня проблемы, мой сервер сильно загружен 200-400 одновременными клиентами каждую секунду, и ожидается, что со временем это число будет расти.
который теперь выглядит так
public ConcurrentHashMap<SocketChannel, UserProfile> clients = new ConcurrentHashMap<SocketChannel, UserProfile>();
Мой дизайн сервера работает так. У меня есть рабочий поток(и) для обработки огромного количества пакетов. Каждый пакет проверяется с помощью подпрограммы packetHandler (не являющейся частью потока), практически любой клиент может вызвать ее в любое время, она почти статична, но это не так.
Весь мой сервер в основном однопоточный, за исключением части обработки пакетов.
В любом случае, когда кто-то использует команду, например, подсчитывает всех клиентов онлайн и получает от них некоторую информацию.
Также возможно, что клиенты могут отключаться и удаляться из ConcurrentHashMap во время подсчета (что вызывает мои проблемы).
Также я хотел бы добавить сюда код.
int txtGirls=0;
int vidGirls=0;
int txtBoys=0;
int vidBoys=0;
Iterator i = clients.values().iterator();
while (i.hasNext()) {
UserProfile person = (UserProfile)i.next();
if(person != null) {
if(person.getChatType()) {
if(person.getGender().equals("m"))
vidBoys++;
else //<-- crash occurs here.
vidGirls++;
} else if(!person.getChatType()) {
if(person.getGender().equals("m"))
txtBoys++;
else
txtGirls++;
}
}
}
Я имею в виду, конечно, что я собираюсь исправить это, добавив исключение try-catch внутри Iterator, чтобы пропустить эти нулевые клиенты.
Но чего я не понимаю, если он проверяет выше, if(person != null) не должен ли вложенный код работать автоматически..
если это не означает, что он был удален во время итерации, что должно быть невозможно, поскольку он потокобезопасен, wtf?
Что я должен делать? или лучше всего попробовать Exception?
Вот исключение
java.lang.NullPointerException
at Server.processPackets(Server.java:398)
at PacketWorker.run(PacketWorker.java:43)
at java.lang.Thread.run(Thread.java:636)
ProcessPackets содержит приведенный выше код. а в комментарии указано количество строк #
Спасибо, что просветили меня.