я использовал HashMap перед тем, какJava ConcurrentHashMap не потокобезопасен .. wth?
public Map<SocketChannel, UserProfile> clients = new HashMap<SocketChannel, UserProfile>();
теперь я переключился на ConcurrentHashMap, чтобы избежать синхронизированных блоков и теперь я испытывающие проблемы мой сервер сильно загружен 200-400 одновременных клиентов каждый второй, который, как ожидается, со временем.
, который теперь выглядит как этот
public ConcurrentHashMap<SocketChannel, UserProfile> clients = new ConcurrentHashMap<SocketChannel, UserProfile>();
дизайн Мой сервер работает следующим образом. У меня есть рабочий поток (ы) для обработки огромного количества пакетов. Каждый пакет проверяется с помощью подпрограммы packageHandler (а не части потока), практически любой клиент может вызвать его в любое время, когда он почти как статический, но это не так.
Весь мой сервер в основном однопоточный, за исключением части обработки пакета.
В любом случае, когда кто-то использует команду, например, подсчитывает всех клиентов онлайн и получает от них некоторую информацию.
Возможно также, что клиенты могут быть отсоединены и удалены с 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++;
}
}
}
Я имею в виду, конечно, я буду это исправить, добавив примерку поймать исключение внутри итератора, чтобы пропустить эти неопределенные клиент.
Но то, что я не понимаю, если он проверяет выше, если (человек! = NULL) не должен код вложен автоматически работает ..
если это не означает, что он был удален в то время как он был итерации, который должно быть невозможно, так как это потокобезопасный wtf?
Что мне делать? или является попыткой исключить лучший способ?
Вот исключение
java.lang.NullPointerException
at Server.processPackets(Server.java:398)
at PacketWorker.run(PacketWorker.java:43)
at java.lang.Thread.run(Thread.java:636)
В processPackets содержит код, указанный выше. и в комментарии указано количество строк #
Спасибо, что просветили меня.
Вы пробовали Collections.synchronizedMap (Карта)? – zengr
«TF» - это то, что ConcurrentHashMap ** является потокобезопасным, но вы ожидаете чего-то еще над безопасностью потоков. –
это также поможет, если вы объясните, что означает «авария здесь». Какая «авария»? Какое исключение? –