Processos i fils
Com fer que un programa avanci diverses tasques alhora sense corrompre les dades ni quedar-se encallat. És la base del bloc següent: un servidor ha d’atendre molts clients a la vegada, i dos processos que es comuniquen per la xarxa s’envien missatges (Sòcols i serveis).
Com llegir aquests documents
Els documents van del concepte general a la implementació concreta:
- Conceptes. Què és la concurrència, en què es diferencia del paral·lelisme, què són processos i fils, i quins dos grans models hi ha per organitzar-la: estat compartit o pas de missatges.
- El problema de compartir. Quan diversos fils toquen les mateixes dades apareixen tres reptes, independents del llenguatge: l’accés segur, la coordinació i la vitalitat (que el sistema no quedi bloquejat).
- La solució a Java. Java fa servir el model d’estat compartit. Primer, com es creen i s’executen els fils. Després, les tècniques per no haver de sincronitzar, per ordre de preferència, abans de les eines de sincronització de baix nivell. La llibreria
java.util.concurrentva al final perquè encapsula tot l’anterior, i és el que faràs servir a la pràctica. - L’alternativa. El pas de missatges evita compartir dades: els fils o els processos es comuniquen enviant-se missatges. És el pont cap a la comunicació per xarxa.
flowchart TD
C["Concurrència"] --> E["Estat compartit"]
C --> M["Pas de missatges"]
E --> J["Java"]
J --> F["Fils"]
F --> T["Tècniques de disseny"]
F --> O["Join, interrupt i volatile"]
T --> S["Sincronització"]
O --> S
S --> L["Llibreria Java concurrent"]
Fonaments
- Concurrència: concurrència i paral·lelisme, processos i fils, i els models de concurrència
- Estat compartit: el model on tots els fils comparteixen dades, amb els reptes d’accés segur, coordinació i vitalitat
Concurrència a Java
- Java: com implementa Java la concurrència, amb la JVM, la memòria i els fils
- Fils: estats d’un fil, com crear-lo i executar-lo, i fils de plataforma i virtuals
- Tècniques de disseny: les quatre tècniques per evitar problemes amb memòria compartida, per ordre de preferència
- Join, interrupt i volatile: esperar la fi d’un fil, aturar-lo des de fora i la visibilitat de l’estat compartit
- Sincronització: monitors, wait i notify, i
ReentrantLock - Llibreria Java concurrent:
java.util.concurrent, amb executors, tasques amb resultat, cues, sincronitzadors i col·leccions concurrents
Sense estat compartit
- Pas de missatges: models síncron i asíncron, cues, gestió de peticions i sistemes reactius
Després
Sòcols i serveis porta el pas de missatges entre processos a la xarxa. Un servidor amb sòcols és, sobretot, un problema de concurrència: atendre diversos clients sense que s’esperin entre ells.
Itinerari curt
Si no pots llegir-ho tot, aquests cinc documents en ordre donen una base suficient per escriure codi concurrent correcte a Java:
Concurrència → Estat compartit → Fils → Tècniques de disseny → Llibreria Java concurrent
Referències
- Java Concurrency Terminology
- Java Language Specification, capítol 17: Threads and Locks
- The Java tutorials: Concurrency
- Java Concurrency and Multithreading Tutorial
- Threads (Java in a nutshell)
- How to work with wait(), notify() and notifyAll() in Java?
- Thread Communication using wait/notify
- The evolution of the producer / consumer problem in Java
- Java CompletableFuture Tutorial with Examples
- Task (JavaFX 25): concurrència a la interfície
- Liveness (The Java Tutorials, Oracle)
- Liveness (Wikipedia)
- The Deadlock Empire
- Thread Safety (6.005: Software Construction)
- What is Thread Dump and How to Analyze them?
- Concurrency: A Primer
Programació i sistemes reactius: