Avatar billede kernelx Juniormester
20. januar 2010 - 09:27 Der er 3 kommentarer og
1 løsning

Er HashMap, LinkedList, ArrayList implementeret med synchronized?

Hi,

er
ArrayList,
HashMap og
LinkedList
implementeret med synchronized?

hvis jeg har to thread som på samme tid prøver at lave ændringer på
f.eks. en HashMap, kan det føre til problemer?
Avatar billede tjp Mester
20. januar 2010 - 10:26 #1
Ingen af dem er synchronized...

Men du kan evt. wrappe dem a la:

List syncList = Collections.synchronizedList(list);
Map syncMap = Collections.synchronizeMap(new HashMap(...));
Avatar billede kernelx Juniormester
20. januar 2010 - 14:50 #2
mange tak!
husk at skrive et eller andet som svar.
Avatar billede tjp Mester
20. januar 2010 - 15:21 #3
Et eller andet... :-)
Avatar billede arne_v Ekspert
20. januar 2010 - 20:02 #4
Lige en (halvlang) ekstra kommentar.

De gamle Vector og Hashtable er synchronized.

De nye ArrayList og HashMap er ikke synchronized men kan wrappes som tjp forklarer.

Men det er meget vigtigt at forstaa at synchronized ikke betyder thread safe.

Synchronized beskytter den interne data struktur ved enkelt metode kald fra forskellige traade.

al.add("A") og al.add("B") i to forskellige traade vil med synchronized altid resultere i at der tilfoejes 2 elementer (i en eller anden raekkefoelge). Med usynchronized kan man risikere kun at faa tilfoejet 0 eller 1 elementer i nogle scenarier hvor et eller begge kald gaar i gang med at flytte rundt paa data fordi arrayet skal udvides.

Men ofte har man flere forskellige metode kald som haenger sammen. Og saa er synchronized ikke nok til at goere koden thread safe.

Eksempel:

Map<String,long> konti;
...
if(konti.get(knr) >= amt) {
  konti.set(knr, konti.get(knr) - amt);
} else {
  // udskriv fejl
}

Selvom konti faktisk peger paa en synchronized map implementation, saa er koden ikke thread safe.

Synchronized sikrer kun mod at to traade kaldet set samtidigt og smadrer den bagvedliggende datastruktur.

Selv med synchronized kan to traade sagtens checke at der er penge paa kontoen samtidigt og saa bagefter begge traekke beloebet fra og faa kontoen i negativ.

I et saadant tilfaelde skal der bruges:

synchronized(konti) {
  if(konti.get(knr) >= amt) {
      konti.set(knr, konti.get(knr) - amt);
  } else {
      // udskriv fejl
  }
}

for at sikre at den er thread safe.

Og i saa tilfaelde er det unoedvendigt at map implementationen er thread safe.

I den virkelige verden er det forholdsvis sjaeldent at en synchronized implementation er nok.

Derfor skiftede man fra synchronized til unsynchronized som det normale i Java 1.2.
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