CodeGym
Promotion
Apprentissage
Cours
Exercices
Sondages & Quiz
Jeux
Aide
Planning
Communauté
Utilisateurs
Forum
Chat
Articles
Témoignages de réussite
Activité
Avis
Abonnements
Thème clair

Leçons

  • Avis
  • À propos de nous
Commencer
Commencer à apprendre
Commencez à apprendre maintenant
  • Mes progrès
  • Cours
  • Carte des quêtes
  • Leçons
  • Deadlock : causes, exemples, résolution

    JAVA 25 SELF
    Niveau 53,Leçon 0
    Dans ce cours, nous expliquons ce qu’est l’interblocage des threads (deadlock) en Java, pourquoi il survient et quelles sont les quatre conditions nécessaires. À l’aide d’un exemple pratique avec synchronized, nous montrons comment reproduire le problème, puis nous étudions des stratégies de prévention : ordre unique de prise des ressources, utilisation de ReentrantLock.tryLock avec délai d’attente, réduction des sections critiques et abandon des verrous imbriqués inutiles. Nous montrerons le diagnostic via Thread Dump et jstack, comment reconnaître les états BLOCKED/ WAITING, et nous terminerons par une liste de contrôle et des erreurs typiques.
    Disponible
  • Livelock et Starvation : définition, exemples

    JAVA 25 SELF
    Niveau 53,Leçon 1
    Nous analysons les anomalies de concurrence Livelock et Starvation : en quoi elles diffèrent de Deadlock, à quoi elles ressemblent dans le code et dans les logs. Des exemples en Java sont présentés : « travailleurs polis » (blocage vivant) et affamement dû aux priorités et aux verrous non équitables. Nous apprenons à détecter le problème (journalisation, Thread dump, VisualVM, Java Mission Control) et à le prévenir : retards aléatoires avant une nouvelle tentative ( Thread.sleep), algorithmes non bloquants, verrous équitables via ReentrantLock avec le drapeau fairness ( new ReentrantLock(true)), sections critiques soignées et éviter l’abus de setPriority() et de synchronized.
    Disponible
  • Collections thread-safe : ConcurrentHashMap et autres

    JAVA 25 SELF
    Niveau 53,Leçon 2
    Dans ce cours, nous verrons pourquoi les collections classiques ( ArrayList, HashMap) sont dangereuses en environnement multithread, et quelles alternatives thread-safe propose le package java.util.concurrent : ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue, des structures basées sur des skip lists et BlockingQueue. Nous discuterons des opérations atomiques comme merge, putIfAbsent, computeIfAbsent, nous les comparerons à Collections.synchronizedMap, et nous examinerons des exemples pratiques ainsi que les erreurs typiques (itérateurs à cohérence faible, séquences d’opérations non atomiques, etc.).
    Disponible
  • AtomicInteger, AtomicReference : opérations atomiques

    JAVA 25 SELF
    Niveau 53,Leçon 3
    Pourquoi l’incrément i ++ ne fonctionne pas en environnement multithread, ce que sont les opérations atomiques et comment le package java.util.concurrent.atomic les fournit. Nous étudions AtomicInteger et AtomicReference, les méthodes incrementAndGet(), compareAndSet(...), le mécanisme interne CAS (Compare-And-Swap), ainsi que quand il vaut mieux choisir synchronized et quand — LongAdder. Pour finir — erreurs typiques : opérations complexes, ABA et sécurité des threads des objets imbriqués.
    Disponible
  • Diagnostic et débogage des programmes multithread

    JAVA 25 SELF
    Niveau 53,Leçon 4
    Comment prendre et lire un Thread Dump à l’aide de jstack, de VisualVM et de l’IDE, reconnaître les états des threads ( RUNNABLE, BLOCKED, WAITING) et détecter les interblocages. Nous examinerons la surveillance des threads dans Java Mission Control et Java Flight Recorder, les pratiques de journalisation (noms des threads, entrée/sortie des blocs synchronized), la minimisation des verrous, les tests de concurrence avec CountDownLatch et l’analyse d’un cas réel de deadlock. Pour finir — erreurs typiques et comment les éviter.
    Disponible
  • Introduction au parallélisme

    JAVA 25 SELF
    Niveau 54,Leçon 0
    Dans ce cours, nous expliquons la différence entre le multithreading et le parallélisme : quand la réactivité est importante, et quand il s’agit d’une accélération réelle sur plusieurs cœurs. Nous aborderons la création de threads via Thread, l’implémentation de Runnable et les pools de haut niveau ExecutorService, nous verrons un exemple simple de somme d’un tableau, nous analyserons quand le parallélisme aide et quand il gêne, ainsi que les problèmes typiques : conditions de course, synchronisation via synchronized, interblocages et équilibrage de charge. À la fin — un tableau comparatif et une visualisation des scénarios.
    Disponible
  • ExecutorService, Callable, Future : lancement des tâches

    JAVA 25 SELF
    Niveau 54,Leçon 1
    La programmation concurrente en pratique, version professionnelle : nous confions les tâches à ExecutorService au lieu de créer des Thread manuellement, nous gérons le pool, la file d’attente et le cycle de vie ( shutdown(), shutdownNow()). Nous examinons la différence entre Runnable et Callable<T>, récupérons les résultats via Future et ses méthodes ( get(), isDone(), cancel(...), isCancelled()). Nous montrerons le lancement de plusieurs tâches, invokeAll/ invokeAny, le traitement d’ ExecutionException et les erreurs typiques.
    Disponible
  • Flux parallèles : syntaxe et utilisation

    JAVA 25 SELF
    Niveau 54,Leçon 2
    Voyons comment basculer un flux de données classique vers un traitement parallèle en une seule ligne — via parallelStream() ou .parallel(), ce qui se passe sous le capot dans ForkJoinPool.commonPool(), quand le parallélisme accélère réellement les calculs (grandes collections, opérations « lourdes ») et où il peut ralentir. Nous montrerons des exemples de filtrage, d’agrégation, de tri, de mesure de performance et analyserons les erreurs typiques : effets de bord dans forEach, préservation de l’ordre, choix des collections et réglage du degré de parallélisme.
    Disponible
  • ForkJoinPool et RecursiveTask : tâches récursives

    JAVA 25 SELF
    Niveau 54,Leçon 3
    Guide pratique des calculs parallèles en Java : comment fonctionne le pool de tâches ForkJoinPool et les tâches récursives RecursiveTask<T>/ RecursiveAction, en quoi l’algorithme de work-stealing est utile, comment découper les tâches via fork() et agréger les résultats avec join() à l’intérieur de compute(). Nous verrons le lancement via pool.invoke(), un exemple de somme d’un tableau et de recherche du maximum, la place de ForkJoinPool dans parallelStream(), ainsi que les erreurs typiques et comment les éviter.
    Disponible
  • Bonnes pratiques de programmation parallèle

    JAVA 25 SELF
    Niveau 54,Leçon 4
    Guide pratique de la programmation parallèle en Java : quand utiliser ExecutorService, où parallelStream aide, et pour quelles tâches ForkJoinPool est nécessaire. Nous discuterons de la sécurité des threads avec ConcurrentHashMap/ CopyOnWriteArrayList et des classes atomiques ( AtomicInteger), des mesures de performance via System.nanoTime() et JMH, de la gestion des erreurs provenant de Future.get() et ForkJoinTask, de la réaction correcte à InterruptedException, ainsi que des techniques de journalisation ( Thread.currentThread().getName()) et de test ( Awaitility). À la fin — un tableau d’aide au choix de l’outil et les erreurs typiques.
    Disponible
  • Introduction à CompletableFuture

    JAVA 25 SELF
    Niveau 55,Leçon 0
    Dans ce cours, nous verrons pourquoi le code synchrone entraîne des blocages, quelles limitations avait Future (comme le get() bloquant), et comment la classe CompletableFuture du package java.util.concurrent change la manière de travailler avec l’asynchronisme. Nous pratiquerons le lancement des tâches en arrière-plan via supplyAsync, l’abonnement au résultat avec thenAccept/ thenApply, nous parlerons du rôle de ForkJoinPool et des erreurs typiques : utiliser get()/ join() dans le thread principal, ne pas gérer les erreurs avec exceptionally/ handle, etc.
    Disponible
  • Tâches asynchrones : thenApply, thenAccept, thenRun

    JAVA 25 SELF
    Niveau 55,Leçon 1
    Nous analysons le lancement et la composition de calculs asynchrones avec CompletableFuture : comment démarrer des tâches via supplyAsync et runAsync, en quoi diffèrent les gestionnaires thenApply, thenAccept, thenRun, et quand choisir leurs versions asynchrones thenApplyAsync/ thenAcceptAsync/ thenRunAsync. Nous parlerons des threads d’exécution ( ForkJoinPool ou votre Executor), des types de résultats ( CompletableFuture<T>, CompletableFuture<Void>) et des erreurs courantes : appels bloquants get()/ join(), erreurs non traitées sans exceptionally/ handle/ whenComplete, ainsi que la tentative d’utiliser le résultat à l’intérieur de thenRun.
    Disponible
  • 1
  • ...
  • 23
  • 24
  • 25
  • 26
  • 27
  • ...
  • 30
Apprendre
  • Inscription
  • Cours Java
  • Aide pour les exercices
  • Tarifs
  • Syntaxe Java
Communauté
  • Utilisateurs
  • Articles
  • Forum
  • Chat
  • Témoignages de réussite
  • Activité
  • Programme d'affiliation
Entreprise
  • À propos de nous
  • Contacts
  • Avis
  • Espace presse
  • CodeGym pour l'éducation
  • FAQ
  • Support
CodeGymCodeGym est un cours en ligne pour apprendre la programmation Java depuis le début. Ce cours est un moyen idéal pour maîtriser Java pour les débutants. Il contient plus de 1200 exercices avec vérification instantanée et un ensemble essentiel de notions fondamentales de Java. Pour vous aider à réussir, nous avons mis en place des fonctionnalités motivantes : quiz, projets de codage, contenu sur l'apprentissage efficace, et une rubrique sur la carrière de développeur Java.
Suivez-nous
Langue de l'interface
English Deutsch Español हिन्दी
Français
Português Polski বাংলা 简体中文 मराठी தமிழ் Italiano Bahasa Indonesia 繁體中文 Nederlands 日本語 한국어 Bulgarian Danish Hungarian Basa Jawa Malay Norwegian Romanian Swedish Telugu Thai Українська Filipino Turkish Azərbaycan Русский Vietnamese
"Les programmeurs se forment, ils ne naissent pas" © 2026 CodeGym
MastercardVisa
"Les programmeurs se forment, ils ne naissent pas" © 2026 CodeGym