Jeg (Jesper) afrunder min JavaOne dækning med eBay gutternes præsentation af diverse patterns og anti-patterns.
class Unsafe { private Map<String, Object> map = null; void useMap() { if (map == null) { initMap(); } // use map } void initMap() { if (map == null) { map = new HashMap<String, Object>(); // fyld i map }
Boom: ConcurrentModificationException!
Første løsning: Så lad dog være med at være lazy!
Ellers: “Cheezy read-write pattern”: Brug lokal variabel i initMap, og brug volatile på mappen.
Hvor der er få, der skriver (og typisk serielt), men mange, der skriver. Løsninger:
De har forskellige fordele og ulemper, men hvis du ændrer data sjældent nok, så bruge copy-on-write.
Logging, f.eks… her skriver man jo en masse data, men de læses ikke, de skrives bare videre. Tre mulige
Hvis man bruger den sidste og bruger TaskExecutor, så husk at dine køer kan løbe fuld.
Hvis koden ikke er en performance bottleneck, så LAD VÆRE med at optimere på det.
Brug nu bare ConcurrentXxx-klasserne…
Plus: Manden ved noget om det han taler om.
Minus: Praktisk bøvl og dumme spørgsmål.
Godt, det var JavaOne 2010: Nu videre til fest og restitution!