SlideShare une entreprise Scribd logo
1  sur  51
Multiverse: STM ,[object Object]
Who am I ,[object Object]
8 Years Professional Experience
Projects I worked on (and I'm proud of) ,[object Object]
Batch processing systems
Enterprisy backend systems ,[object Object],[object Object]
Distributed computing
Software architecture
Patterns
[object Object]
There is enough time
I like the discussion
Agenda ,[object Object]
Software Transactional Memory (Multiverse) as alternative concurrency control implementation
What is wrong? ,[object Object]
public class Account{ private int balance; public synchronized int getBalance(){ Return balance; } public synchronized void setBalance(int newBalance){ this.balance = newBalance; } public inc(int delta){ setBalance(getBalance()+delta); } } Not Composable
What is wrong? ,[object Object]
Expose Implementation details
public class Account{ private int balance; public synchronized int getBalance(){ Return balance; } public synchronized inc(int delta){ this.balance += balance; } } static void transfer(Account from, Account to, int amount){ synchronized(from){ synchronized(to){ from.inc(-amount); to.inc(amount); } } } Expose implementation details
public class Account{ private int balance; private Lock lock = new ReentrantLock(); public int getBalance(){ ... } public inc(int delta){ lock.acquire() try{ balance+=delta; }finally{ lock.release() } } } void transfer(Account from, Account to, int amount{ synchronized(from){ synchronized(to){ from.inc(-amount); to.inc(amount); } } } Expose implementation details
What is wrong? ,[object Object]
Expose Implementation details
Deadlock prone
static void transfer(Account from, Account to, int amount){ synchronized(from){ synchronized(to){ from.inc(-amount); to.inc(amount); } } } Deadlocks
What is wrong? ,[object Object]
Expose Implementation details
Deadlock prone
Operation is not atomic
public class Account{ private int balance; public int getBalance(){ Return balance; } public inc(int delta){ if(balance + delta<0) Throw new NotEnoughCashException() this.balance += balance; } } static void transfer(Account from, Account to, int amount){ to.inc(amount); from.inc(-amount); } Not atomic
Questions? ,[object Object]
Could concurrency control be just as easy as gc?
STM: What? ,[object Object]
Consistency (task of the Java Objects)
Isolation
Durability (not provided)
Multiverse: What? ,[object Object]
Multiple Programming Models ,[object Object]
Instrumentation (very time consuming!!)
@AtomicObject public class Account{ private int balance; public int getBalance(){ Return balance; } public void inc(int delta){ this.balance += balance; } } @AtomicMethod static void transfer(Account from, Account to, int amount){ from.inc(-amount); to.inc(amount); } Using STM: POJO based
@AtomicObject public class Account{ private int balance; @Exclude private int ignore; public int getBalance(){ Return balance; } public void inc(int delta){ this.balance += balance; } } Excluding fields
Multiverse: What? ,[object Object]
Multiple Programming Models ,[object Object]
Instrumentation (very time consuming!!) ,[object Object],[object Object]
@AtomicObject public class Account{ final Ref<Integer> balance = new Ref<Integer>(); public int getBalance(){ Return balance.get(); } public void inc(int delta){ balance.set(balance.get()+delta); } } @AtomicMethod static void transfer(Account from, Account to, int amount){ from.inc(-amount); to.inc(amount); } Using STM : Managed Ref based
Multiverse: What? ,[object Object]
Multiple Programming Models ,[object Object]
Instrumentation (very time consuming!!) ,[object Object],[object Object],[object Object]
Multiverse: How? ,[object Object]
Tranlocal (State)
@AtomicObject public class Account{ private int balance; public int getBalance(){ Return balance; } public inc(int delta){ this.balance += balance; } } Multiverse: How
@AtomicObject public class Account implements AtomicObject{ AtomicReference<Account__Tranlocal> current =  New AtomicReference(); public int getBalance(){ Account__Tranlocal a = getTransaction().load(this); return a.balance; } public void inc(int delta){ Account__Tranlocal a = getTransaction().load(this); a.balance+=delta; } public Account__Tranlocal load(long version){..} public boolean lock(Transaction t){..} public void store(Account__Tranlocal tranlocal){...} ... } public class Account__Tranlocal{ long version; Account atomicObject; int balance; } Multiverse: How

Contenu connexe

Tendances

If You Think You Can Stay Away from Functional Programming, You Are Wrong
If You Think You Can Stay Away from Functional Programming, You Are WrongIf You Think You Can Stay Away from Functional Programming, You Are Wrong
If You Think You Can Stay Away from Functional Programming, You Are Wrong
Mario Fusco
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical File
Soumya Behera
 

Tendances (20)

How to Think in RxJava Before Reacting
How to Think in RxJava Before ReactingHow to Think in RxJava Before Reacting
How to Think in RxJava Before Reacting
 
Comparing different concurrency models on the JVM
Comparing different concurrency models on the JVMComparing different concurrency models on the JVM
Comparing different concurrency models on the JVM
 
Java concurrency questions and answers
Java concurrency questions and answers Java concurrency questions and answers
Java concurrency questions and answers
 
Java 8 streams
Java 8 streamsJava 8 streams
Java 8 streams
 
If You Think You Can Stay Away from Functional Programming, You Are Wrong
If You Think You Can Stay Away from Functional Programming, You Are WrongIf You Think You Can Stay Away from Functional Programming, You Are Wrong
If You Think You Can Stay Away from Functional Programming, You Are Wrong
 
Java Class Design
Java Class DesignJava Class Design
Java Class Design
 
Parallel streams in java 8
Parallel streams in java 8Parallel streams in java 8
Parallel streams in java 8
 
OOP and FP
OOP and FPOOP and FP
OOP and FP
 
Parallel Programming With Dot Net
Parallel Programming With Dot NetParallel Programming With Dot Net
Parallel Programming With Dot Net
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical File
 
Java 8 lambda expressions
Java 8 lambda expressionsJava 8 lambda expressions
Java 8 lambda expressions
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJava
 
Java 8 presentation
Java 8 presentationJava 8 presentation
Java 8 presentation
 
Comparing JVM languages
Comparing JVM languagesComparing JVM languages
Comparing JVM languages
 
Java.util.concurrent.concurrent hashmap
Java.util.concurrent.concurrent hashmapJava.util.concurrent.concurrent hashmap
Java.util.concurrent.concurrent hashmap
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
 
Java 8 lambda
Java 8 lambdaJava 8 lambda
Java 8 lambda
 
Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
 
Java 8 Workshop
Java 8 WorkshopJava 8 Workshop
Java 8 Workshop
 
Advanced Debugging Using Java Bytecodes
Advanced Debugging Using Java BytecodesAdvanced Debugging Using Java Bytecodes
Advanced Debugging Using Java Bytecodes
 

En vedette (6)

Prelim Slides
Prelim SlidesPrelim Slides
Prelim Slides
 
Quick into to Software Transactional Memory in Frege
Quick into to Software Transactional Memory in FregeQuick into to Software Transactional Memory in Frege
Quick into to Software Transactional Memory in Frege
 
Automatic Loop Parallelization using STM
Automatic Loop Parallelization using STMAutomatic Loop Parallelization using STM
Automatic Loop Parallelization using STM
 
Software Transactional Memory (STM) in Frege
Software Transactional Memory (STM) in Frege Software Transactional Memory (STM) in Frege
Software Transactional Memory (STM) in Frege
 
24. Advanced Transaction Processing in DBMS
24. Advanced Transaction Processing in DBMS24. Advanced Transaction Processing in DBMS
24. Advanced Transaction Processing in DBMS
 
Implementing STM in Java
Implementing STM in JavaImplementing STM in Java
Implementing STM in Java
 

Similaire à Software Transactioneel Geheugen

Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Mario Fusco
 
Stackless Python In Eve
Stackless Python In EveStackless Python In Eve
Stackless Python In Eve
l xf
 
Concurrency on the JVM
Concurrency on the JVMConcurrency on the JVM
Concurrency on the JVM
Vaclav Pech
 

Similaire à Software Transactioneel Geheugen (20)

Deuce STM - CMP'09
Deuce STM - CMP'09Deuce STM - CMP'09
Deuce STM - CMP'09
 
Thread
ThreadThread
Thread
 
Java Concurrency
Java ConcurrencyJava Concurrency
Java Concurrency
 
Clojure concurrency
Clojure concurrencyClojure concurrency
Clojure concurrency
 
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
Why Spring <3 Kotlin
Why Spring <3 KotlinWhy Spring <3 Kotlin
Why Spring <3 Kotlin
 
Concurrency in Programming Languages
Concurrency in Programming LanguagesConcurrency in Programming Languages
Concurrency in Programming Languages
 
Ejb3 Dan Hinojosa
Ejb3 Dan HinojosaEjb3 Dan Hinojosa
Ejb3 Dan Hinojosa
 
Qt Workshop
Qt WorkshopQt Workshop
Qt Workshop
 
Principles of the Play framework
Principles of the Play frameworkPrinciples of the Play framework
Principles of the Play framework
 
TechTalk - Dotnet
TechTalk - DotnetTechTalk - Dotnet
TechTalk - Dotnet
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
Kotlin for Android Developers - 3
Kotlin for Android Developers - 3Kotlin for Android Developers - 3
Kotlin for Android Developers - 3
 
Stackless Python In Eve
Stackless Python In EveStackless Python In Eve
Stackless Python In Eve
 
Java tut1
Java tut1Java tut1
Java tut1
 
Tutorial java
Tutorial javaTutorial java
Tutorial java
 
Java Tut1
Java Tut1Java Tut1
Java Tut1
 
Java Tutorial
Java TutorialJava Tutorial
Java Tutorial
 
Concurrency on the JVM
Concurrency on the JVMConcurrency on the JVM
Concurrency on the JVM
 

Plus de Devnology

Slides Felienne Hermans Symposium EWI
Slides Felienne Hermans Symposium EWISlides Felienne Hermans Symposium EWI
Slides Felienne Hermans Symposium EWI
Devnology
 
Devnology auteursrecht en open source 20130205
Devnology auteursrecht en open source 20130205Devnology auteursrecht en open source 20130205
Devnology auteursrecht en open source 20130205
Devnology
 
Learn a language : LISP
Learn a language : LISPLearn a language : LISP
Learn a language : LISP
Devnology
 
Devnology Back to School IV - Agility en Architectuur
Devnology Back to School IV - Agility en ArchitectuurDevnology Back to School IV - Agility en Architectuur
Devnology Back to School IV - Agility en Architectuur
Devnology
 
Introduction to Software Evolution: The Software Volcano
Introduction to Software Evolution: The Software VolcanoIntroduction to Software Evolution: The Software Volcano
Introduction to Software Evolution: The Software Volcano
Devnology
 
Devnology Workshop Genpro 2 feb 2011
Devnology Workshop Genpro 2 feb 2011Devnology Workshop Genpro 2 feb 2011
Devnology Workshop Genpro 2 feb 2011
Devnology
 
Devnology Coding Dojo 05-01-2011
Devnology Coding Dojo 05-01-2011Devnology Coding Dojo 05-01-2011
Devnology Coding Dojo 05-01-2011
Devnology
 
Spoofax: ontwikkeling van domeinspecifieke talen in Eclipse
Spoofax: ontwikkeling van domeinspecifieke talen in EclipseSpoofax: ontwikkeling van domeinspecifieke talen in Eclipse
Spoofax: ontwikkeling van domeinspecifieke talen in Eclipse
Devnology
 
Experimenting with Augmented Reality
Experimenting with Augmented RealityExperimenting with Augmented Reality
Experimenting with Augmented Reality
Devnology
 
Unit testing and MVVM in Silverlight
Unit testing and MVVM in SilverlightUnit testing and MVVM in Silverlight
Unit testing and MVVM in Silverlight
Devnology
 
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingmobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
Devnology
 

Plus de Devnology (20)

What do we really know about the differences between static and dynamic types?
What do we really know about the differences between static and dynamic types?What do we really know about the differences between static and dynamic types?
What do we really know about the differences between static and dynamic types?
 
Meetup at SIG: Meten is weten
Meetup at SIG: Meten is wetenMeetup at SIG: Meten is weten
Meetup at SIG: Meten is weten
 
Software Operation Knowledge
Software Operation KnowledgeSoftware Operation Knowledge
Software Operation Knowledge
 
Slides Felienne Hermans Symposium EWI
Slides Felienne Hermans Symposium EWISlides Felienne Hermans Symposium EWI
Slides Felienne Hermans Symposium EWI
 
Devnology auteursrecht en open source 20130205
Devnology auteursrecht en open source 20130205Devnology auteursrecht en open source 20130205
Devnology auteursrecht en open source 20130205
 
The top 10 security issues in web applications
The top 10 security issues in web applicationsThe top 10 security issues in web applications
The top 10 security issues in web applications
 
Hacking Smartcards & RFID
Hacking Smartcards & RFIDHacking Smartcards & RFID
Hacking Smartcards & RFID
 
Learn a language : LISP
Learn a language : LISPLearn a language : LISP
Learn a language : LISP
 
Learn a language : LISP
Learn a language : LISPLearn a language : LISP
Learn a language : LISP
 
Devnology Back to School: Empirical Evidence on Modeling in Software Development
Devnology Back to School: Empirical Evidence on Modeling in Software DevelopmentDevnology Back to School: Empirical Evidence on Modeling in Software Development
Devnology Back to School: Empirical Evidence on Modeling in Software Development
 
Devnology Back to School IV - Agility en Architectuur
Devnology Back to School IV - Agility en ArchitectuurDevnology Back to School IV - Agility en Architectuur
Devnology Back to School IV - Agility en Architectuur
 
Devnology Back to School III : Software impact
Devnology Back to School III : Software impactDevnology Back to School III : Software impact
Devnology Back to School III : Software impact
 
Devnology back toschool software reengineering
Devnology back toschool software reengineeringDevnology back toschool software reengineering
Devnology back toschool software reengineering
 
Introduction to Software Evolution: The Software Volcano
Introduction to Software Evolution: The Software VolcanoIntroduction to Software Evolution: The Software Volcano
Introduction to Software Evolution: The Software Volcano
 
Devnology Workshop Genpro 2 feb 2011
Devnology Workshop Genpro 2 feb 2011Devnology Workshop Genpro 2 feb 2011
Devnology Workshop Genpro 2 feb 2011
 
Devnology Coding Dojo 05-01-2011
Devnology Coding Dojo 05-01-2011Devnology Coding Dojo 05-01-2011
Devnology Coding Dojo 05-01-2011
 
Spoofax: ontwikkeling van domeinspecifieke talen in Eclipse
Spoofax: ontwikkeling van domeinspecifieke talen in EclipseSpoofax: ontwikkeling van domeinspecifieke talen in Eclipse
Spoofax: ontwikkeling van domeinspecifieke talen in Eclipse
 
Experimenting with Augmented Reality
Experimenting with Augmented RealityExperimenting with Augmented Reality
Experimenting with Augmented Reality
 
Unit testing and MVVM in Silverlight
Unit testing and MVVM in SilverlightUnit testing and MVVM in Silverlight
Unit testing and MVVM in Silverlight
 
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingmobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
 

Software Transactioneel Geheugen

  • 1.
  • 2.
  • 3. 8 Years Professional Experience
  • 4.
  • 6.
  • 10.
  • 12. I like the discussion
  • 13.
  • 14. Software Transactional Memory (Multiverse) as alternative concurrency control implementation
  • 15.
  • 16. public class Account{ private int balance; public synchronized int getBalance(){ Return balance; } public synchronized void setBalance(int newBalance){ this.balance = newBalance; } public inc(int delta){ setBalance(getBalance()+delta); } } Not Composable
  • 17.
  • 19. public class Account{ private int balance; public synchronized int getBalance(){ Return balance; } public synchronized inc(int delta){ this.balance += balance; } } static void transfer(Account from, Account to, int amount){ synchronized(from){ synchronized(to){ from.inc(-amount); to.inc(amount); } } } Expose implementation details
  • 20. public class Account{ private int balance; private Lock lock = new ReentrantLock(); public int getBalance(){ ... } public inc(int delta){ lock.acquire() try{ balance+=delta; }finally{ lock.release() } } } void transfer(Account from, Account to, int amount{ synchronized(from){ synchronized(to){ from.inc(-amount); to.inc(amount); } } } Expose implementation details
  • 21.
  • 24. static void transfer(Account from, Account to, int amount){ synchronized(from){ synchronized(to){ from.inc(-amount); to.inc(amount); } } } Deadlocks
  • 25.
  • 29. public class Account{ private int balance; public int getBalance(){ Return balance; } public inc(int delta){ if(balance + delta<0) Throw new NotEnoughCashException() this.balance += balance; } } static void transfer(Account from, Account to, int amount){ to.inc(amount); from.inc(-amount); } Not atomic
  • 30.
  • 31. Could concurrency control be just as easy as gc?
  • 32.
  • 33. Consistency (task of the Java Objects)
  • 36.
  • 37.
  • 39. @AtomicObject public class Account{ private int balance; public int getBalance(){ Return balance; } public void inc(int delta){ this.balance += balance; } } @AtomicMethod static void transfer(Account from, Account to, int amount){ from.inc(-amount); to.inc(amount); } Using STM: POJO based
  • 40. @AtomicObject public class Account{ private int balance; @Exclude private int ignore; public int getBalance(){ Return balance; } public void inc(int delta){ this.balance += balance; } } Excluding fields
  • 41.
  • 42.
  • 43.
  • 44. @AtomicObject public class Account{ final Ref<Integer> balance = new Ref<Integer>(); public int getBalance(){ Return balance.get(); } public void inc(int delta){ balance.set(balance.get()+delta); } } @AtomicMethod static void transfer(Account from, Account to, int amount){ from.inc(-amount); to.inc(amount); } Using STM : Managed Ref based
  • 45.
  • 46.
  • 47.
  • 48.
  • 50. @AtomicObject public class Account{ private int balance; public int getBalance(){ Return balance; } public inc(int delta){ this.balance += balance; } } Multiverse: How
  • 51. @AtomicObject public class Account implements AtomicObject{ AtomicReference<Account__Tranlocal> current = New AtomicReference(); public int getBalance(){ Account__Tranlocal a = getTransaction().load(this); return a.balance; } public void inc(int delta){ Account__Tranlocal a = getTransaction().load(this); a.balance+=delta; } public Account__Tranlocal load(long version){..} public boolean lock(Transaction t){..} public void store(Account__Tranlocal tranlocal){...} ... } public class Account__Tranlocal{ long version; Account atomicObject; int balance; } Multiverse: How
  • 52.
  • 53.
  • 56.
  • 59. import java.util.*; final List<String> l = Collections.synchronizedList(new LinkedList()); void add(String item){ l.add(item); } void addAll(String... items){ for(String item:items){ l.add(item); } } Drop in collections - before
  • 60. import java.util.*; import org.multiverse.datastructures.collections.*; final List<String> l = new StrictLinkedBlockingDeque(); void l(String item){ l.add(item); } @AtomicMethod void addAll(String... items){ for(String item:items){ l.add(item); } } Drop in collections - after
  • 61. import java.util.*; import org.multiverse.datastructures.collections.*; final List<String> l1 = new StrictLinkedBlockingDeque(); final List<String> l2 = new StrictLinkedBlockingDeque(); @AtomicMethod void add(String item){ l1.add(item); l2.add(item); } @AtomicMethod void addAll(String... items){ for(String s: items){ add(s); } } Drop in collections – Woohaa
  • 62.
  • 65.
  • 68. @AtomicObject public class IntRef{ private int value; public void set(int newValue){ this.newValue = newValue; } @AtomicMethod(readonly = true) public int get(){ return value; } } Readonly vs Update Transactions
  • 69.
  • 71.
  • 72. Locks can't be obtained
  • 73.
  • 74. @AtomicObject Class IntRef{ int value = 0; @AtomicMethod(retryCount = 100) void inc(){ value++; } } Automatic retrying transactions
  • 75. @AtomicObject Class IntRef{ int value = 0; void inc(){ Transaction t = getTransaction() if(t!=null){ //there already is a transaction value++; }else{ //there is no transaction, lets create one t = stm.startTransaction() int attempt = 1; while(attempt-1 <= 100){ try{ value++; t.commit() }catch(RecoverableException ex){ attempt++; t.abortAndReset(); } } throw new TooManyRetriesException(); } } } Automatic retrying transactions
  • 76.
  • 77.
  • 80.
  • 81. @AtomicObject public class TStack<E>{ private Node<E> head; public void push(E item){ head = new Node<E>(head, item); } public E pop(){ if(head == null){ retry(); } Node<E> oldHead = head; head = head.next; return oldHead.value; } static class Node{ final Node<E> next; final E value; Node(Node<E> next, E value){ this.next = next; this.value = value; } } }
  • 82.
  • 83. TStack<Integer> stack1 = new TStack<Integer>(); TStack<Integer> stack2 = new TStack<Integer>(); @AtomicMethod public int popFromOneOfTheStacks(){ if(!stack1.isEmpty()){ Return stack1.pop(); } if(!stack2.isEmpty()){ Return stack2.pop(); } retry(); return -1;//is never executed }
  • 84.
  • 85. TStack<Integer> stack1 = new TStack<Integer>(); TStack<Integer> stack2 = new TStack<Integer>(); @AtomicMethod public int popFromOneOfTheStacks(){ return new OrElseTemplate<Integer>(){ void runOr(){ return stack1.pop(); } void runElse(){ return stack2.pop(); } }.execute(); }
  • 86. TStack<Integer> stack1 = new TStack<Integer>(); TStack<Integer> stack2 = new TStack<Integer>(); @AtomicMethod public int popFromOneOfTheStacks(){ return new OrElseTemplate<Integer>(){ void runOr(){ return stack1.pop(); } void runElse(){ return stack2.pop(); } }.execute(); }
  • 87. atomic{ either{ stack1.pop() }orelse{ stack2.pop() } }
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 100.
  • 101.
  • 102.
  • 112.
  • 115.