CodeGym
Promozione
Learning
Corsi
Tasks
Surveys & Quizzes
Games
Help
Schedule
Community
Users
Forum
Chat
Articles
Success stories
Activity
Reviews
Subscriptions
Tema chiaro

Lezioni

  • Recensioni
  • Chi siamo
Inizia
Inizia a imparare
Start learning now
  • I miei progressi
  • Corsi
  • Mappa Quest
  • Lezioni
  • Deadlock: cause, esempi, risoluzione

    JAVA 25 SELF
    Livello 53,Lezione 0
    In questa lezione analizziamo che cos'è il blocco reciproco dei thread (deadlock) in Java, perché si verifica e quali sono le quattro condizioni necessarie. Con un esempio pratico con synchronized mostriamo come riprodurre il problema, poi studiamo strategie di prevenzione: ordine unico di acquisizione delle risorse, uso di ReentrantLock.tryLock con timeout, riduzione delle sezioni critiche e rinuncia a lock annidati superflui. Mostriamo la diagnostica tramite Thread Dump e jstack, come riconoscere gli stati BLOCKED/ WAITING, e concludiamo con una checklist ed errori tipici.
    Disponibile
  • Livelock e Starvation: definizione ed esempi

    JAVA 25 SELF
    Livello 53,Lezione 1
    Analizziamo le anomalie di concorrenza Livelock e Starvation: in cosa differiscono da Deadlock, come appaiono nel codice e nei log. Vengono mostrati esempi in Java: «lavoratori educati» (blocco vivente) e starvation dovuta alle priorità e a lock non equi. Impariamo a individuare il problema (logging, Thread dump, VisualVM, Java Mission Control) e a prevenirlo: ritardi casuali prima del nuovo tentativo ( Thread.sleep), algoritmi non bloccanti, lock equi tramite ReentrantLock con flag di fairness ( new ReentrantLock(true)), sezioni critiche curate e niente abusi di setPriority() e synchronized.
    Disponibile
  • Collezioni thread-safe: ConcurrentHashMap e altre

    JAVA 25 SELF
    Livello 53,Lezione 2
    In questa lezione vedremo perché le collezioni normali ( ArrayList, HashMap) sono pericolose in un ambiente multithread e quali alternative thread-safe offre il pacchetto java.util.concurrent: ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue, strutture basate su skip list e BlockingQueue. Discuteremo operazioni atomiche come merge, putIfAbsent, computeIfAbsent, confronteremo con Collections.synchronizedMap, analizzeremo esempi pratici ed errori tipici (iteratori debolmente consistenti, sequenze di operazioni non atomiche, ecc.).
    Disponibile
  • AtomicInteger, AtomicReference: operazioni atomiche

    JAVA 25 SELF
    Livello 53,Lezione 3
    Perché l'incremento i ++ non funziona nel multithreading, che cosa sono le operazioni atomiche e come le offre il package java.util.concurrent.atomic. Analizziamo AtomicInteger e AtomicReference, i metodi incrementAndGet(), compareAndSet(...), il meccanismo interno CAS (Compare-And-Swap), nonché quando è meglio scegliere synchronized e quando — LongAdder. In chiusura — errori tipici: operazioni complesse, ABA e thread-safety degli oggetti annidati.
    Disponibile
  • Diagnostica e debug di programmi multithread

    JAVA 25 SELF
    Livello 53,Lezione 4
    Come acquisire e leggere un Thread Dump con jstack, VisualVM e l’IDE, riconoscere gli stati dei thread ( RUNNABLE, BLOCKED, WAITING) e trovare i deadlock. Vedremo il monitoraggio dei thread con Java Mission Control e Java Flight Recorder, pratiche di logging (nomi dei thread, ingresso/uscita da synchronized), minimizzazione dei blocchi, test della concorrenza con CountDownLatch e analisi di un caso reale di deadlock. Infine — errori tipici e come evitarli.
    Disponibile
  • Introduzione al parallelismo

    JAVA 25 SELF
    Livello 54,Lezione 0
    In questa lezione analizziamo la differenza tra multithreading e parallelismo: dove conta la reattività e dove — il reale incremento di velocità su più core. Discuteremo la creazione di thread tramite Thread, l’implementazione di Runnable e i pool di alto livello ExecutorService, vedremo un semplice esempio di somma di un array, capiremo quando il parallelismo aiuta e quando ostacola, nonché i problemi tipici: race condition sui dati, sincronizzazione tramite synchronized, deadlock e bilanciamento del carico. Alla fine — una tabella comparativa e una visualizzazione degli scenari.
    Disponibile
  • ExecutorService, Callable, Future: esecuzione di attività

    JAVA 25 SELF
    Livello 54,Lezione 1
    Pratica del multithreading in modo serio: passiamo le attività a ExecutorService invece della creazione manuale di Thread, gestiamo il pool, la coda e il ciclo di vita ( shutdown(), shutdownNow()). Analizziamo la differenza tra Runnable e Callable<T>, otteniamo i risultati tramite Future e i suoi metodi ( get(), isDone(), cancel(...), isCancelled()). Mostreremo l'esecuzione di più attività, invokeAll/ invokeAny, la gestione di ExecutionException e gli errori tipici.
    Disponibile
  • Stream paralleli: sintassi e utilizzo

    JAVA 25 SELF
    Livello 54,Lezione 2
    Vediamo come passare da un flusso sequenziale all’elaborazione parallela con una sola riga — tramite parallelStream() oppure .parallel(), cosa accade sotto il cofano in ForkJoinPool.commonPool(), quando il parallelismo accelera davvero i calcoli (collezioni grandi, operazioni «pesanti») e dove invece può rallentare. Mostreremo esempi di filtraggio, aggregazione, ordinamento, misurazione delle prestazioni e analizzeremo gli errori tipici: effetti collaterali in forEach, mantenimento dell’ordine, scelta delle collezioni e configurazione del grado di parallelismo.
    Disponibile
  • ForkJoinPool e RecursiveTask: task ricorsivi

    JAVA 25 SELF
    Livello 54,Lezione 3
    Guida pratica al calcolo parallelo in Java: come funziona il pool di task ForkJoinPool e i task ricorsivi RecursiveTask<T>/ RecursiveAction, perché è utile l’algoritmo di work-stealing, come suddividere i task con fork() e unire i risultati con join() all’interno di compute(). Vedremo l’avvio tramite pool.invoke(), un esempio di somma di un array e di ricerca del massimo, il ruolo di ForkJoinPool in parallelStream(), nonché gli errori tipici e come evitarli.
    Disponibile
  • Buone pratiche della programmazione parallela

    JAVA 25 SELF
    Livello 54,Lezione 4
    Guida pratica alla programmazione parallela in Java: quando conviene usare ExecutorService, dove aiuta parallelStream e per quali compiti serve ForkJoinPool. Discuteremo la thread-safety con ConcurrentHashMap/ CopyOnWriteArrayList e le classi atomiche ( AtomicInteger), le misurazioni delle prestazioni tramite System.nanoTime() e JMH, la gestione degli errori da Future.get() e ForkJoinTask, la corretta reazione a InterruptedException, nonché tecniche di logging ( Thread.currentThread().getName()) e di test ( Awaitility). Alla fine — una tabella di scelta degli strumenti e gli errori tipici.
    Disponibile
  • Introduzione a CompletableFuture

    JAVA 25 SELF
    Livello 55,Lezione 0
    In questa lezione capiremo perché il codice sincrono porta a blocchi, quali limiti aveva Future (ad esempio il get() bloccante) e come la classe CompletableFuture del package java.util.concurrent cambi il modo di lavorare con l’asincronia. Faremo pratica avviando attività in background con supplyAsync, registrandoci al risultato con thenAccept/ thenApply, discuteremo il ruolo del pool ForkJoinPool e gli errori tipici: uso di get()/ join() nel thread principale, assenza di gestione degli errori tramite exceptionally/ handle e altro.
    Disponibile
  • Attività asincrone: thenApply, thenAccept, thenRun

    JAVA 25 SELF
    Livello 55,Lezione 1
    Analizziamo l’avvio e la composizione di calcoli asincroni con CompletableFuture: come avviare attività tramite supplyAsync e runAsync, in cosa differiscono gli handler thenApply, thenAccept, thenRun e quando scegliere le loro versioni asincrone thenApplyAsync/ thenAcceptAsync/ thenRunAsync. Parleremo dei thread di esecuzione ( ForkJoinPool o un tuo Executor), dei tipi di risultato ( CompletableFuture<T>, CompletableFuture<Void>) e degli errori tipici: chiamate bloccanti get()/ join(), errori non gestiti senza exceptionally/ handle/ whenComplete, nonché il tentativo di usare il risultato all’interno di thenRun.
    Disponibile
  • 1
  • ...
  • 23
  • 24
  • 25
  • 26
  • 27
  • ...
  • 30
Learn
  • Registration
  • Java Course
  • Help with Tasks
  • Pricing
  • Game Projects
  • Java Syntax
Community
  • Users
  • Articles
  • Forum
  • Chat
  • Success Stories
  • Activity
  • Affiliate Program
Company
  • About us
  • Contacts
  • Reviews
  • Press Room
  • CodeGym for EDU
  • FAQ
  • Support
CodeGymCodeGym is an online course for learning Java programming from scratch. This course is a perfect way to master Java for beginners. It contains 1200+ tasks with instant verification and an essential scope of Java fundamentals theory. To help you succeed in education, we’ve implemented a set of motivational features: quizzes, coding projects, content about efficient learning, and a Java developer’s career.
Follow us
Lingua dell'interfaccia
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
"Programmers Are Made, Not Born" © 2026 CodeGym
MastercardVisa
"Programmers Are Made, Not Born" © 2026 CodeGym