SlideShare uma empresa Scribd logo
1 de 46
Baixar para ler offline
Programmation concurrente en Java
Florian Beaufumé
03/2017
Florian Beaufumé
• Architecte logiciel Java et web
• Freelance
• florian.beaufume@adeliosys.fr
• www.adeliosys.fr
• www.linkedin.com/in/fbeaufume
• fr.slideshare.net/fbeaufume
• Concepts
• Java SE
• Java EE et Spring
Sommaire
Concepts
• "Le nombre de transistor double tous les deux ans"
• "La fréquence double chaque 1,5 année"
Lois de Moore
• Concurrence :
• Des tâches qui peuvent se chevaucher
• Alternées ou pas
• Parallélisme :
• Exécution simultanées au niveau matériel
Concurrence vs parallélisme
• Gain maximal de latence suivant la part parallélisable du
traitement
Loi d'Amdahl
• Processus découpé en threads
• Natif vs green
• Ordonnancement préemptif vs coopératif
• Time slicing
• Fonctionnalités de distribution et coordination
• Bénéfices
• Utilisation des ressources
• Réactivité
• Couts
• Complexité de conception et débugging
• Ressources par thread et context switching
Modèle multi-threads
• Thread safe < Immutable < Stateless
• Section critique
• Opération atomique
• Contention
• Deadlock
• Starvation
Définitions
Java SE
• Concurrence intégrée au langage
• Basé sur des threads :
• Nom
• Priorité : 1 à 10
• Daemon ou pas
• Etat : NEW, RUNNABLE, BLOCKED, WAITING, etc.
• Pile d'appel
• Exemple :
• Mémoire partagée suivant le Java Memory Model
Java 1.0
Java 1.0 - Threads de base
• Synchronisation de threads pour accéder à des données
Java 1.0 - Synchronized
• Permet d'implémenter un scope request :
• Sécurité (identité, droits)
• Transaction
• Tenant
• Java 1.2 : InheritableThreadLocal
Java 1.0 - ThreadLocal
• Exemple java.util.Timer :
• Un thread par timer
• Pas de garantie d'exécution
Java 1.3 - Timers
• Ajout de java.util.concurrent, merci Doug Lea
• Java Memory Model
• Interactions entre les threads
et la mémoire
• "Happens before"
• Volatile :
• R et W en mémoire principale
plutôt que sur cache CPU
• Rend R et W 64 bits (long et
double) atomique
• Mais pas un incrément
• Permet de la synchronisation
simple
Java 5
• Volatile seul
• Synchronized en écriture + volatile
Java 5 - Volatile
• Singleton lazy loadé classique
• Via double checked locking
Java 5 - Double checked locking
• ReentrantLock
• ReentrantReadWriteLock
Java 5 - Locks
• Coordination de threads sur des étapes
Java 5 - CountDownLatch
main
workers
await()
countdown()
• Map<K, V>
• Hashtable : synchronisée, clés et valeurs non null
• HashMap : pas synchronisée, accepte clés et valeurs nulles
• ConcurrentMap<K, V>
• Etend Map<K, V>
• Méthodes atomiques comme putIfAbsent(key, value)
• ConcurrentHashMap, implémentation efficace
Java 5 - ConcurrentHashMap
• Exécution de tâches sur pool de threads
Java 5 - Executors (1/2)
Executor
Executor
Service
ThreadPool
Executor
Interfaces Classes
Scheduled
Executor
Service
Scheduled
ThreadPool
Executor
void execute(Runnable)
Supporte Future, ex :
Future<T> submit(Callable<T> task)
Supporte scheduling, ex :
ScheduledFuture scheduleAtFixedRate(
Runnable command,
long initialDelay,
long period,
TimeUnit unit)
Java 5 - Executors (2/2)
• Nombres atomiques
• Semaphore
• Et d'autres
Java 5 - Divers
• Equivalent mono-JVM de MapReduce
• Décompose une tache en sous-taches et recompose le
résultat final
• Fonctionne par work-stealing
• Etendre RecursiveAction (si pas de résultat) ou
RecursiveTask (si résultat)
Java 7 - Fork/join (1/2)
Java 7 - Fork/join (2/2)
• Adder
• Bonnes performances (reporte les ajouts si besoin)
• Accumulator
• Généralisation de l'Adder
Java 8 - Adders et accumulators
Java 8 - StampedLock (1/2)
synchronized
synchronized (W)
et volatile
ReentrantLock
ReentrantRWLock
StampedLock
Simplicité
Bonnes perfs en lecture
Ajout de fonctionnalités (timed
wait, try lock, etc.)
Bonnes perfs en lecture
Bonnes perfs, fonctionnalités
(upgrade de lock R en W, etc.)
Fonctionnalités
Java 8 - StampedLock (2/2)
• Execution dans le ForkJoinPool commun
• Parallélisme du ForkJoinPool commun :
• Par system property :
• -Djava.util.concurrent.ForkJoinPool.common.parallelism=7
• Sinon Runtime.getRuntime().availableProcessors() - 1
• Le thread courant aussi est utilisé
• Ou dans un ForkJoinPool custom
Java 8 - Parallel streams (1/2)
• Pas toujours plus performant, varie suivant :
• Type de collection : ArrayList plutôt que LinkedList
• Nature du traitement
• Taille de "N*Q" (nb d'élément * cout par élément)
• Nombre de cœurs, il faut > 1
• Mesurer les deux
• Par défaut utilisent tous le ForkJoinPool commun
• Attention aux lambdas stateful
Java 8 - Parallel streams (2/2)
• Classe qui implémente Future et CompletionStage
• Pour combiner/chainer des actions
• Syntaxe fonctionnelle
Java 8 - CompletableFuture
Java EE et Spring
• Modèle "thread-per-request" avec pools de thread
(HTTP/Servlet, EJB)
• Solutions Java SE fonctionnent mais…
• … utiliser les threads du framework
• Contextes de sécurité et de transaction
• Modèles de composants (Servlet, EJB, Spring, etc) :
• Cycle de vie et scope : request, session, etc.
• Modèle de concurrence, voir de locking
Principes généraux
• Servlet
• SingleThreadModel est déprécié
• Une instance pour toutes les requêtes, donc thread-safe
• Spring et CDI
• Concurrence manuelle via solutions de Java SE
• EJB session singleton
• @ConcurrencyManagement : container ou bean
• @AccessTimeout
• @Lock : read ou write
• Autres
Concurrence des composants
• EJB 3.1 (Java EE 6)
• Spring 3 ou Spring Data
• CDI
• Peut s'implémenter via intercepteur maison
• Evènements asynchrones de CDI 2 (Java EE 8)
Méthodes asynchrones
• Concurrency Utilities (Java EE 7)
• Spring
Executors
• EJB 3.1 Timer Service (Java EE 6)
• Concurrency Utilities (Java EE 7)
• Spring 3
Scheduling
• Concurrence d'accès aux données entre requêtes
utilisateurs
• "Transaction longue" quand plusieurs transactions de BD
• Solutions : locking optimiste ou pessimiste
Locking de persistance
R1 W1
R2 W2
t
Conflit
• Fonctionnement
• OptimisticLockException en cas de problème
• Pour faible taux de conflits
• Bénéfices
• Scalabilité
• Portabilité
• Inconvénients
• Gérer le conflit : reload, force, merge
Locking optimiste
R W
t
version=3 version=4
JPA
Hibernate"update … where version=3""select …"
• Fonctionnement
• Pour fort taux de conflits
• Bénéfices
• Simplicité
• Inconvénients
• Contention
• Pour transactions courtes
Locking pessimiste par la base
R W
t
"select … for update" "update …"
JPA 2
Hibernate
• Fonctionnement
• Table de lock (id, entityClass, entityId, userId, date)
• Pour fort taux de conflits
• Bénéfices
• Fonctions avancées (monitoring, historisation, etc)
• Inconvénients
• Mode édition dans l'UI
• Gérer l'expiration des locks
• Plus d'accès à la base
• Contention
Locking pessimiste applicatif
R W
t
JPA
Hibernate
Lock Unlock
florian.beaufume@adeliosys.fr
www.adeliosys.fr
www.linkedin.com/in/fbeaufume
fr.slideshare.net/fbeaufume
Merci

Mais conteúdo relacionado

Mais procurados

Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesosebiznext
 
Postman - Dev/var 15
Postman - Dev/var 15Postman - Dev/var 15
Postman - Dev/var 15Jonathan SAEZ
 
Migration de Tomcat vers Vert.x
Migration de Tomcat vers Vert.xMigration de Tomcat vers Vert.x
Migration de Tomcat vers Vert.xFlorianBoulay
 
A la queue leu leu
A la queue leu leuA la queue leu leu
A la queue leu leunautilebleu
 
Djangocong 2010 django-et_xmpp
Djangocong 2010 django-et_xmppDjangocong 2010 django-et_xmpp
Djangocong 2010 django-et_xmppJean-Michel ARMAND
 
nouveautés du moteur Bonita 7.9
nouveautés du moteur Bonita 7.9nouveautés du moteur Bonita 7.9
nouveautés du moteur Bonita 7.9Bonitasoft
 
Run java vs ruby
Run java vs rubyRun java vs ruby
Run java vs rubypinguin666
 
Les Promises en Javascript
Les Promises en JavascriptLes Promises en Javascript
Les Promises en JavascriptBenoit Zohar
 
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQAMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQMicrosoft
 
2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.jsTelecomValley
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another frameworkLAHAXE Arnaud
 
RSocket un protocole réseau pour les Reactive Streams
RSocket un protocole réseau pour les Reactive StreamsRSocket un protocole réseau pour les Reactive Streams
RSocket un protocole réseau pour les Reactive StreamsVMware Tanzu
 
NodeJs, une introduction
NodeJs, une introductionNodeJs, une introduction
NodeJs, une introductionToxicode
 
Meetup du 21 septembre 2017
Meetup du 21 septembre 2017Meetup du 21 septembre 2017
Meetup du 21 septembre 2017AFUP_Limoges
 
Présentation de nodejs
Présentation de nodejsPrésentation de nodejs
Présentation de nodejs13p
 

Mais procurados (20)

FinistJUG - Apache TomEE
FinistJUG - Apache TomEEFinistJUG - Apache TomEE
FinistJUG - Apache TomEE
 
Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesos
 
Postman - Dev/var 15
Postman - Dev/var 15Postman - Dev/var 15
Postman - Dev/var 15
 
Migration de Tomcat vers Vert.x
Migration de Tomcat vers Vert.xMigration de Tomcat vers Vert.x
Migration de Tomcat vers Vert.x
 
A la queue leu leu
A la queue leu leuA la queue leu leu
A la queue leu leu
 
JAVA 8
JAVA 8JAVA 8
JAVA 8
 
Djangocong 2010 django-et_xmpp
Djangocong 2010 django-et_xmppDjangocong 2010 django-et_xmpp
Djangocong 2010 django-et_xmpp
 
nouveautés du moteur Bonita 7.9
nouveautés du moteur Bonita 7.9nouveautés du moteur Bonita 7.9
nouveautés du moteur Bonita 7.9
 
Python + ansible = ♥
Python + ansible = ♥Python + ansible = ♥
Python + ansible = ♥
 
Run java vs ruby
Run java vs rubyRun java vs ruby
Run java vs ruby
 
Les Promises en Javascript
Les Promises en JavascriptLes Promises en Javascript
Les Promises en Javascript
 
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQAMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
 
2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another framework
 
Javascript proprement
Javascript proprementJavascript proprement
Javascript proprement
 
Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013
 
RSocket un protocole réseau pour les Reactive Streams
RSocket un protocole réseau pour les Reactive StreamsRSocket un protocole réseau pour les Reactive Streams
RSocket un protocole réseau pour les Reactive Streams
 
NodeJs, une introduction
NodeJs, une introductionNodeJs, une introduction
NodeJs, une introduction
 
Meetup du 21 septembre 2017
Meetup du 21 septembre 2017Meetup du 21 septembre 2017
Meetup du 21 septembre 2017
 
Présentation de nodejs
Présentation de nodejsPrésentation de nodejs
Présentation de nodejs
 

Semelhante a Programmation concurrente en Java

Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3Louis Jacomet
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
Présentation de Apache Zookeeper
Présentation de Apache ZookeeperPrésentation de Apache Zookeeper
Présentation de Apache ZookeeperMichaël Morello
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfJean-Michel Doudoux
 
Introduction à Play Framework 2
Introduction à Play Framework 2Introduction à Play Framework 2
Introduction à Play Framework 2Samy Dindane
 
EventMachine
EventMachineEventMachine
EventMachineLeTesteur
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring BatchOlivier BAZOUD
 
Du JavaScript dans mon projet
Du JavaScript dans mon projetDu JavaScript dans mon projet
Du JavaScript dans mon projetjollivetc
 
Elasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautésElasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautésMathieu Elie
 
Direct memory 3_devoxx_fr_2012-2.04.18
Direct memory 3_devoxx_fr_2012-2.04.18Direct memory 3_devoxx_fr_2012-2.04.18
Direct memory 3_devoxx_fr_2012-2.04.18Benoit Perroud
 
Direct memory @ devoxxfr
Direct memory @ devoxxfrDirect memory @ devoxxfr
Direct memory @ devoxxfrOlivier Lamy
 
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!bleporini
 
Meetup django-2012-06-14
Meetup django-2012-06-14Meetup django-2012-06-14
Meetup django-2012-06-14nautilebleu
 
Introduction Erlang - altnet fr Juin 2013
Introduction Erlang - altnet fr Juin 2013Introduction Erlang - altnet fr Juin 2013
Introduction Erlang - altnet fr Juin 2013Yann Schwartz
 

Semelhante a Programmation concurrente en Java (20)

Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Présentation de Apache Zookeeper
Présentation de Apache ZookeeperPrésentation de Apache Zookeeper
Présentation de Apache Zookeeper
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
 
Introduction à Play Framework 2
Introduction à Play Framework 2Introduction à Play Framework 2
Introduction à Play Framework 2
 
EventMachine
EventMachineEventMachine
EventMachine
 
Ejb 3
Ejb 3Ejb 3
Ejb 3
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Introduction Kotlin
Introduction KotlinIntroduction Kotlin
Introduction Kotlin
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring Batch
 
Du JavaScript dans mon projet
Du JavaScript dans mon projetDu JavaScript dans mon projet
Du JavaScript dans mon projet
 
Spring Batch ParisJUG
Spring Batch ParisJUG Spring Batch ParisJUG
Spring Batch ParisJUG
 
Elasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautésElasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautés
 
Formation Google App Engine
Formation Google App EngineFormation Google App Engine
Formation Google App Engine
 
Direct memory 3_devoxx_fr_2012-2.04.18
Direct memory 3_devoxx_fr_2012-2.04.18Direct memory 3_devoxx_fr_2012-2.04.18
Direct memory 3_devoxx_fr_2012-2.04.18
 
Direct memory @ devoxxfr
Direct memory @ devoxxfrDirect memory @ devoxxfr
Direct memory @ devoxxfr
 
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
 
Meetup django-2012-06-14
Meetup django-2012-06-14Meetup django-2012-06-14
Meetup django-2012-06-14
 
Introduction Erlang - altnet fr Juin 2013
Introduction Erlang - altnet fr Juin 2013Introduction Erlang - altnet fr Juin 2013
Introduction Erlang - altnet fr Juin 2013
 

Programmation concurrente en Java

  • 1. Programmation concurrente en Java Florian Beaufumé 03/2017
  • 2. Florian Beaufumé • Architecte logiciel Java et web • Freelance • florian.beaufume@adeliosys.fr • www.adeliosys.fr • www.linkedin.com/in/fbeaufume • fr.slideshare.net/fbeaufume
  • 3. • Concepts • Java SE • Java EE et Spring Sommaire
  • 5. • "Le nombre de transistor double tous les deux ans" • "La fréquence double chaque 1,5 année" Lois de Moore
  • 6. • Concurrence : • Des tâches qui peuvent se chevaucher • Alternées ou pas • Parallélisme : • Exécution simultanées au niveau matériel Concurrence vs parallélisme
  • 7. • Gain maximal de latence suivant la part parallélisable du traitement Loi d'Amdahl
  • 8. • Processus découpé en threads • Natif vs green • Ordonnancement préemptif vs coopératif • Time slicing • Fonctionnalités de distribution et coordination • Bénéfices • Utilisation des ressources • Réactivité • Couts • Complexité de conception et débugging • Ressources par thread et context switching Modèle multi-threads
  • 9. • Thread safe < Immutable < Stateless • Section critique • Opération atomique • Contention • Deadlock • Starvation Définitions
  • 11. • Concurrence intégrée au langage • Basé sur des threads : • Nom • Priorité : 1 à 10 • Daemon ou pas • Etat : NEW, RUNNABLE, BLOCKED, WAITING, etc. • Pile d'appel • Exemple : • Mémoire partagée suivant le Java Memory Model Java 1.0
  • 12. Java 1.0 - Threads de base
  • 13. • Synchronisation de threads pour accéder à des données Java 1.0 - Synchronized
  • 14. • Permet d'implémenter un scope request : • Sécurité (identité, droits) • Transaction • Tenant • Java 1.2 : InheritableThreadLocal Java 1.0 - ThreadLocal
  • 15. • Exemple java.util.Timer : • Un thread par timer • Pas de garantie d'exécution Java 1.3 - Timers
  • 16.
  • 17. • Ajout de java.util.concurrent, merci Doug Lea • Java Memory Model • Interactions entre les threads et la mémoire • "Happens before" • Volatile : • R et W en mémoire principale plutôt que sur cache CPU • Rend R et W 64 bits (long et double) atomique • Mais pas un incrément • Permet de la synchronisation simple Java 5
  • 18. • Volatile seul • Synchronized en écriture + volatile Java 5 - Volatile
  • 19. • Singleton lazy loadé classique • Via double checked locking Java 5 - Double checked locking
  • 21. • Coordination de threads sur des étapes Java 5 - CountDownLatch main workers await() countdown()
  • 22. • Map<K, V> • Hashtable : synchronisée, clés et valeurs non null • HashMap : pas synchronisée, accepte clés et valeurs nulles • ConcurrentMap<K, V> • Etend Map<K, V> • Méthodes atomiques comme putIfAbsent(key, value) • ConcurrentHashMap, implémentation efficace Java 5 - ConcurrentHashMap
  • 23. • Exécution de tâches sur pool de threads Java 5 - Executors (1/2) Executor Executor Service ThreadPool Executor Interfaces Classes Scheduled Executor Service Scheduled ThreadPool Executor void execute(Runnable) Supporte Future, ex : Future<T> submit(Callable<T> task) Supporte scheduling, ex : ScheduledFuture scheduleAtFixedRate( Runnable command, long initialDelay, long period, TimeUnit unit)
  • 24. Java 5 - Executors (2/2)
  • 25. • Nombres atomiques • Semaphore • Et d'autres Java 5 - Divers
  • 26.
  • 27. • Equivalent mono-JVM de MapReduce • Décompose une tache en sous-taches et recompose le résultat final • Fonctionne par work-stealing • Etendre RecursiveAction (si pas de résultat) ou RecursiveTask (si résultat) Java 7 - Fork/join (1/2)
  • 28. Java 7 - Fork/join (2/2)
  • 29. • Adder • Bonnes performances (reporte les ajouts si besoin) • Accumulator • Généralisation de l'Adder Java 8 - Adders et accumulators
  • 30. Java 8 - StampedLock (1/2) synchronized synchronized (W) et volatile ReentrantLock ReentrantRWLock StampedLock Simplicité Bonnes perfs en lecture Ajout de fonctionnalités (timed wait, try lock, etc.) Bonnes perfs en lecture Bonnes perfs, fonctionnalités (upgrade de lock R en W, etc.) Fonctionnalités
  • 31. Java 8 - StampedLock (2/2)
  • 32. • Execution dans le ForkJoinPool commun • Parallélisme du ForkJoinPool commun : • Par system property : • -Djava.util.concurrent.ForkJoinPool.common.parallelism=7 • Sinon Runtime.getRuntime().availableProcessors() - 1 • Le thread courant aussi est utilisé • Ou dans un ForkJoinPool custom Java 8 - Parallel streams (1/2)
  • 33. • Pas toujours plus performant, varie suivant : • Type de collection : ArrayList plutôt que LinkedList • Nature du traitement • Taille de "N*Q" (nb d'élément * cout par élément) • Nombre de cœurs, il faut > 1 • Mesurer les deux • Par défaut utilisent tous le ForkJoinPool commun • Attention aux lambdas stateful Java 8 - Parallel streams (2/2)
  • 34. • Classe qui implémente Future et CompletionStage • Pour combiner/chainer des actions • Syntaxe fonctionnelle Java 8 - CompletableFuture
  • 35. Java EE et Spring
  • 36. • Modèle "thread-per-request" avec pools de thread (HTTP/Servlet, EJB) • Solutions Java SE fonctionnent mais… • … utiliser les threads du framework • Contextes de sécurité et de transaction • Modèles de composants (Servlet, EJB, Spring, etc) : • Cycle de vie et scope : request, session, etc. • Modèle de concurrence, voir de locking Principes généraux
  • 37. • Servlet • SingleThreadModel est déprécié • Une instance pour toutes les requêtes, donc thread-safe • Spring et CDI • Concurrence manuelle via solutions de Java SE • EJB session singleton • @ConcurrencyManagement : container ou bean • @AccessTimeout • @Lock : read ou write • Autres Concurrence des composants
  • 38. • EJB 3.1 (Java EE 6) • Spring 3 ou Spring Data • CDI • Peut s'implémenter via intercepteur maison • Evènements asynchrones de CDI 2 (Java EE 8) Méthodes asynchrones
  • 39. • Concurrency Utilities (Java EE 7) • Spring Executors
  • 40. • EJB 3.1 Timer Service (Java EE 6) • Concurrency Utilities (Java EE 7) • Spring 3 Scheduling
  • 41.
  • 42. • Concurrence d'accès aux données entre requêtes utilisateurs • "Transaction longue" quand plusieurs transactions de BD • Solutions : locking optimiste ou pessimiste Locking de persistance R1 W1 R2 W2 t Conflit
  • 43. • Fonctionnement • OptimisticLockException en cas de problème • Pour faible taux de conflits • Bénéfices • Scalabilité • Portabilité • Inconvénients • Gérer le conflit : reload, force, merge Locking optimiste R W t version=3 version=4 JPA Hibernate"update … where version=3""select …"
  • 44. • Fonctionnement • Pour fort taux de conflits • Bénéfices • Simplicité • Inconvénients • Contention • Pour transactions courtes Locking pessimiste par la base R W t "select … for update" "update …" JPA 2 Hibernate
  • 45. • Fonctionnement • Table de lock (id, entityClass, entityId, userId, date) • Pour fort taux de conflits • Bénéfices • Fonctions avancées (monitoring, historisation, etc) • Inconvénients • Mode édition dans l'UI • Gérer l'expiration des locks • Plus d'accès à la base • Contention Locking pessimiste applicatif R W t JPA Hibernate Lock Unlock