Avatar billede kernelx Juniormester
02. oktober 2010 - 13:52 Der er 2 kommentarer og
1 løsning

performance, synchronized og HashMap

Hi,

jeg har en Map instance:
Map map<String,Object> = new HashMap<String,Object>();

Nu er der flere threads som samtidig har access til denne map.
Alle threads har mulighed for at adde, remove eller gette informationer til denne thread.

MEN:
hvis en thread tilføjer en KEY, så er koden sådan, at ingen andre thead vil tilføje den samme KEY:

public void addValue(Object value) {
  String key = sequence.getNewKey();
  map.put(key, value);
}

en thread som tilføjer en key er den eneste thread som kan fjerne denne key.

ALLE threads har mulighed for at læse ALLE keys.

// thread 123:
String v = map.get("1");

// thread 124:
String v = map.get("1");


Kan jeg lade være med at bruge synchronized?
Eller kan det ske, at hvis to threads samtidig tilføjer to forskellige keys, at java Map interna ikke kan handle det rigtigt og
kun en key bliver tilføjet.


Mit spørgsmål er? kan det ske, at der kommer problemer, hvis jeg IKKE bruger synchronized, men garanterer, at flere forskellige threads aldrig vil komme til at tilføje eller fjerne den samme key, men alle threads har read-access til alle keys.

med venlig hilsen
kernelx
Avatar billede arne_v Ekspert
02. oktober 2010 - 16:15 #1
Du boer bruge synchronized.

Der er ingen garanti for at det virker uden.

Det er faktisk overvejdende sandsynligt at det vil give fejl.

Hash tabel baserede systemer fungerer normalt ved at man har et array af key-value pairs og saa bruger man hash af key som index ind i dette array. Forskellene paa forskellige systemer drejer sig normalt om hvordan man haandterer to forskellige keys med samme hash vaerdi.

I din model kan to forskellige traade godt have hver deres key med samme hash varedi. Og saa kan det gaa galt - data corruption.

Indvidere kan det ogsaa gaa galt hvis en anden traad forsoeger at laese noget som er ved at blive indsat - inkonsistente resultater.

Den gamle Hashtable synkroniserer metoderne, men idag vil man normalt bruge HashMap og selv synkronisere.

*ELLER* bruge java.util.concurrent.ConcurrentHashMap !!

(jeg har hoert godt om dens performance)
Avatar billede kernelx Juniormester
02. oktober 2010 - 22:40 #2
mange mange tak!
husk at skrive et eller andet som svar :-)
Avatar billede arne_v Ekspert
03. oktober 2010 - 01:03 #3
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester