Java ConcurrentHashMap не потокобезопасен .. wth?

Я использовал HashMap раньше, как

   public Map<SocketChannel, UserProfile> clients = new HashMap<SocketChannel, UserProfile>();

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

который теперь выглядит так

public ConcurrentHashMap<SocketChannel, UserProfile> clients = new ConcurrentHashMap<SocketChannel, UserProfile>();

Мой сервер работает следующим образом. У меня есть рабочий поток (-ы) для обработки огромного количества пакетов. Каждый пакет проверяется подпрограммой packetHandler (не частью потока), практически любой клиент может вызвать ее в любое время, это почти как static, но это не так.

Весь мой сервер в основном однопоточный, за исключением обработки пакетов часть.

В любом случае, когда кто-то использует такую ​​команду, как подсчет всех клиентов в сети и получение от них некоторой информации.

Также возможно, что клиенты могут быть отключены и удалены из 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, чтобы пропустить эти нулевые клиенты.

Но что я не понимаю, если он проверяет выше, если (человек! = null) не должен ли вложенный код работать автоматически ..

если это не значит, что он был удален во время итерации, что должно быть невозможно, поскольку это потокобезопасный wtf?

Что мне делать? или это лучший способ try-catch 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 содержит приведенный выше код. а в комментарии указано количество строк #

Спасибо, что просветили меня.

8
задан SSpoke 16 September 2010 в 02:04
поделиться