Java >> Java tutorial >  >> Tag >> synchronized

Java undgå race tilstand UDEN synkroniseret/lås

Undgå tilstand.
Gør din ansøgning som statsløs som det er muligt.
Hver tråd (handlingssekvens) bør tage en kontekst i begyndelsen og bruge denne kontekst til at overføre den fra metode til metode som en parameter.

Når denne teknik ikke løser alle dine problemer, skal du bruge den hændelsesdrevne mekanisme (+Beskedkø ).
Når din kode skal dele noget med andre komponenter, kaster den begivenhed (meddelelse) til en slags bus (emne, kø, hvad som helst).

Komponenter kan registrere lyttere til at lytte efter begivenheder og reagere passende.
I dette tilfælde er der ingen løbsbetingelser (undtagen indsættelse af begivenheder i køen). Hvis du bruger klar-til-brug-kø og ikke selv koder det, burde det være effektivt nok.

Tag også et kig på skuespillermodellen.


Først og fremmest bruger Atomic-klasser låsning (via synkroniserede og flygtige søgeord), ligesom du ville gøre, hvis du selv gjorde det i hånden.

For det andet fungerer uforanderlighed fantastisk til multi-threading, du behøver ikke længere skærmlåse og sådan, men det er fordi du kun kan læse dine uforanderlige ting, du kan ændre dem.

Du kan ikke slippe af med synkroniseret/flygtig, hvis du vil undgå løbsforhold i et multithreaded Java-program (dvs. hvis de flere tråde kan læse OG SKRIVE de samme data). Dit bedste bud er, hvis du ønsker bedre ydeevne, at undgå i det mindste nogle af de indbyggede trådsikre klasser, som gør en slags mere generisk låsning, og lave din egen implementering, som er mere bundet til din kontekst og dermed kan give dig mulighed for at brug mere granulær synkronisering og låseanskaffelse.

Tjek denne implementering af BlockingCache udført af Ehcache-fyrene;

http://www.massapi.com/source/ehcache-2.4.3/src/net/sf/ehcache/constructs/blocking/BlockingCache.java.html


Atomics er faktisk mere effektive end klassiske låse på grund af deres ikke-blokerende adfærd, dvs. en tråd, der venter på at få adgang til hukommelsesplaceringen, bliver ikke kontekstskiftet, hvilket sparer en masse tid.

Sandsynligvis den bedste rettesnor, når synkronisering er nødvendig, er at se, hvordan du kan reducere den kritiske sektionsstørrelse så meget som muligt. Generelle ideer omfatter:

  1. Brug læse-skrive-låse i stedet for fulde låse, når kun en del af trådene skal skrives.
  2. Find måder at omstrukturere kode på for at reducere størrelsen af ​​kritiske sektioner.
  3. Brug atomics, når du opdaterer en enkelt variabel.
  4. Bemærk, at nogle algoritmer og datastrukturer, der traditionelt har brug for låse, har låsefri versioner (de er dog mere komplicerede).

Java tag