Samtidighed på jvm

23
Concurrency on the JVM 15 min introduktion til samtidighed Niels Bech Nielsen [email protected]

Transcript of Samtidighed på jvm

Page 1: Samtidighed på jvm

Concurrency on the JVM15 min introduktion til samtidighed

Niels Bech [email protected]

Page 2: Samtidighed på jvm

Om...

● 20+ års erfaring med objektorienteret systemudvikling

● Undervist på datamatiker- og datanomuddannelsen

● Tidligere Global Chief Engineer @ JP Morgan Rates i Glasgow○ Intraday Risk Management○ Trade capture

Page 3: Samtidighed på jvm

Behovet for samtidighed

● Bruger respons○ Single-threaded UI

● Udnyttelse af multi-core arkitektur○ Parallel arkitektur

● Resourceudnyttelse○ Eksempelvis parallel I/O

Page 4: Samtidighed på jvm

Java samtidighed

● Frem til Java 5 meget primitiv håndtering○ Manuel (og farlig) trådhåndtering○ Objekt-Monitor synkronisering○ Wait-Notify paradigme

● Java 5++○ Executors, Callables, Futures○ ReadWriteLocks○ (Fork-Join)

Page 5: Samtidighed på jvm

Task scheduling

● Bedst udnyttelse baseret på○ Antal processor/cores

■ Runtime.getRuntime().availableProcessors();○ Blocking coefficiency

■ Graden af blokerende I/O operationer

poolsize = number of cores / (1 - blocking coefficient)

Page 6: Samtidighed på jvm

Example

Pattern for Task Scheduling

Net Asset Value (NAV) = summen af (aktie * gældende kurs)

Page 7: Samtidighed på jvm

Samtidighedsproblem

● Samtidighedsproblemer er ○ altid non-deterministisk○ Som regel sporadisk○ Svære at se i koden

● Optræder når○ Mere end én tråd○ Arbejder på fælles data○ Mindst en tråd skriver til data

Fjern en betingelse og problemet er løst

Page 8: Samtidighed på jvm

Deling af tilstand

● Shared mutability○ Alle tråde kan tilgå og skrive til data direkte

● Isolated mutability○ Kun 1 tråd tilgår og skriver til data

● Immutability○ Skrevne data kan ikke ændres○ brugen af final○ copy on write collections○ Linked Lists, Tries

Page 9: Samtidighed på jvm

Shared mutability

● Shared mutability kan ikke undgåes● Har få værktøjer i java

○ volatile○ AtomicXXX○ synchronized○ Locks

Page 10: Samtidighed på jvm

Deling eksempel

Users*

Page 11: Samtidighed på jvm

Software Transactional Memory

● Baseret på databaseteknologi○ A)tomic○ C)onsistent○ I )solated○ D)urable

● Skrivninger foregår i en transaktion○ idempotent○ Uden side-effekt

● Automatic retry on rollback● Anvendt i visse funktionelle sprog

○ f.eks. clojure

Not necessary

Page 12: Samtidighed på jvm

Clojure

● Separation mellem reference og tilstand○ Tilstand er immutable○ Kun Identity Objects (ref) er skrivbare

● Referencer kan kun ændres i en transaktion

Balance

100

200

Transacted

Page 13: Samtidighed på jvm

Simpel clojure eksempel

(def balance (ref 0))

(println "Balance is " @balance)

(dosync (ref-set balance 100))

(println "Balance is now " @balance)

Page 14: Samtidighed på jvm

Write skew

● Clojure transaktioner sikrer mod samtidige skrivninger fra flere tråde

● Læsning er uden for transaktion○ Seneste committede værdi

(def checking-account (ref 500))(def savings-account (ref 600))

(defn withdraw-account [from-balance constraining-balance amount] (dosync (let [total-balance (+ @from-balance @constraining-balance)] (if (>= (- total-balance amount) 1000) (alter from-balance - amount) (println "Sorry can't withdraw due to insufficient funds") ) ) ))

(future (withdraw-account checking-account savings-account 100))(future (withdraw-account savings-account checking-account 100))

Page 15: Samtidighed på jvm

STM i Java

● Man kan anvende clojure direkte i java○ import clojure.lang.Ref;

● STM også implementeret i andre libraries○ e.g. Multiverse

Page 16: Samtidighed på jvm

STM Usage

● Atomare skrivninger med automatisk retry○ Idempotent operations○ Ingen side-effekter

● Simpel, garanteret datakonsistens● Bedst til få skrivninger og mange læsninger

Page 17: Samtidighed på jvm

Actors paradigme

● Beskedbaseret kommunikation mellem objekter

● En Actor○ har sin egen beskedkø○ Udfører kald sekventielt

● Kald til actor○ Som udgangspunkt asynkron○ Blokerer ved synkrone kald

● Alle actors deler en threadpool● Meget benyttet i Erlang og Scala

○ Scala har flere actor libraries○ Kommende eksempler bruger akka (jboner)

Page 18: Samtidighed på jvm

Actor livscyklus

Created

Started

Stopped

Ready Running

Active

Page 19: Samtidighed på jvm

Scala Untyped Actorclass HollywoodActor extends Actor { def receive = { case role => println "Playing " + role }}

object HollywoodActor { def main(args: Array[String]) : Unit = { val johnnyDepp = Actor.actorOf[HollywoodActor].start() johnnyDepp ! "Jack Sparrow" johnnyDepp ! "Edward Scissorhands" johnnyDepp ! "Willy Wonka" Actors.registry.shutdownAll }}

Page 20: Samtidighed på jvm

Scala Untyped Actor (synkron)class FortuneTeller extends Actor { def receive = { case name : String => self.reply_?(String.format("%s, your future is bright", name)) }}

object FortuneTeller { def main(args: Array[String]) : Unit = { val nostradamus = Actor.actorOf[FortuneTeller].start() nostradamus ! "Niels" val response = nostradamus !! "Martin" response match { case Some(responseMessage) => println(responseMessage) case None => println ("Never got a response before timeout") } Actors.registry.shutdownAll }}

Page 21: Samtidighed på jvm

Typed Actor

Wrap objektinstans som actorAlle metodekald bliver håndteret asynkrontI scala bruges scala traits som typeGiver et objekt med isolated mutability

Page 22: Samtidighed på jvm

Actors

● Bryder traditionel sekvensprogrammering○ events etc

● Derfor velegnet til multi-core paradigme

Page 23: Samtidighed på jvm

Sammenfatning

Skaler dine opgaver til parallel udførsel

● Java har fået meget bedre værktøjer til samtidighedsprogrammering, men...○ STM kan med fordel anvendes ved større read-

intensive datamodeller○ Actors bryder traditionel sekvensprogrammering og

isolerer udførsel via (primært) asynkrone beskeder

poolsize = number of cores / (1 - blocking coefficient)