Stavo usando HashMap prima comeJava ConcurrentHashMap non thread safe .. wth?
public Map<SocketChannel, UserProfile> clients = new HashMap<SocketChannel, UserProfile>();
ora ho passato a ConcurrentHashMap per evitare blocchi sincronizzati e problemi ora sto vivendo il mio server è pesantemente caricato con 200-400 client concorrenti ogni secondo che dovrebbe crescere nel tempo.
che ora assomiglia a questo
public ConcurrentHashMap<SocketChannel, UserProfile> clients = new ConcurrentHashMap<SocketChannel, UserProfile>();
Il mio progetto server funziona come questo. Ho un thread di lavoro per l'elaborazione di enormi quantità di pacchetti. Ogni pacchetto viene controllato con una sub-routine packetHandler (non parte del thread), praticamente qualsiasi client può chiamarlo in qualsiasi momento è quasi come statico, ma non lo è.
Il mio intero server è per lo più a thread singolo tranne per la porzione di elaborazione dei pacchetti.
In ogni caso, quando qualcuno utilizza un comando come contare tutti i client online e ottenere alcune informazioni da loro.
È inoltre possibile che i client possano essere disconnessi e rimossi da ConcurrentHashMap mentre il conteggio è in corso (che causa i miei problemi).
Anche io vorrei aggiungere del codice qui.
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++;
}
}
}
intendo, naturalmente, ho intenzione di risolvere il problema con l'aggiunta di un Exception try-catch all'interno del Iterator di saltare questi clienti nulli.
Ma quello che non capisco se si verifica soprattutto se (persona! = Null) non dovrebbe automaticamente il codice nidificato funziona ..
se non vuol dire che ha ottenuto rimosso mentre era l'iterazione che dovrebbe essere impossibile dato che è thread safe wtf?
Cosa devo fare? o è l'eccezione try-catch nel modo migliore?
Ecco l'eccezione
java.lang.NullPointerException
at Server.processPackets(Server.java:398)
at PacketWorker.run(PacketWorker.java:43)
at java.lang.Thread.run(Thread.java:636)
I processPackets contiene il codice di cui sopra. e il commento indica il conteggio delle righe #
Grazie per avermi illuminato.
Hai provato Collections.synchronizedMap (mappa)? – zengr
"TF" è che ConcurrentHashMap ** è ** thread-safe, ma ci si aspetta qualcosa in più sulla sicurezza dei thread. –
sarebbe anche d'aiuto se hai spiegato cosa significa "crash si verifica qui". Che tipo di "incidente"? Qual è l'eccezione? –