Nyheder og Jobs

Concurrency Grab Bag: More Gotchas, Patterns, and Tips on Practical Concurrency

Jeg (Jesper) afrunder min JavaOne dækning med eBay gutternes præsentation af diverse patterns og anti-patterns.

“Double-checked locking” on collection

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.

Many readers – few writers

Hvor der er få, der skriver (og typisk serielt), men mange, der skriver. Løsninger:

  • Synchronized Data Structures
  • ReadWriteLock
  • Copy-on-write
  • ConcurrentHashMap.

De har forskellige fordele og ulemper, men hvis du ændrer data sjældent nok, så bruge copy-on-write.

Many writers, few readers

Logging, f.eks… her skriver man jo en masse data, men de læses ikke, de skrives bare videre. Tre mulige

  • Synchronized Data Structures: Dårlig idé! Blokerer for ofte.
  • ConcurrentHashMap and friends: Som regel den bedste idé.
  • Asynchronous (background processing): God idé, specielt hvis opgaven er seriel i natur, f.eks. logning til disk.

Hvis man bruger den sidste og bruger TaskExecutor, så husk at dine køer kan løbe fuld.

    Husk nu:

    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!