Next in Concurrency

9

Per l'anno scorso ho lavorato molto sulla concorrenza in Java e ho creato e lavorato su molti pacchetti simultanei. Quindi, in termini di sviluppo nel mondo concorrente, sono abbastanza fiducioso. Inoltre sono molto interessato a imparare e capire di più sulla programmazione concorrente.

Ma non sono in grado di rispondere a me stesso in seguito? Quale extra dovrei imparare o lavorare per ereditare più competenze relative all'elaborazione Multi-core. Se c'è un bel libro (leggi e goditi 'concorrenza in pratica' e 'programmazione concorrente in java') o risorse relative all'elaborazione multi-core in modo che io possa passare al livello successivo?

    
posta Jatin 13.09.2011 - 17:28
fonte

6 risposte

8

Disclaimer - Non sono un esperto di concorrenza, ma il mio co-autore è, lo sto pappagliando: -)

Dato che hai letto i libri di Doug Lea e Brian Goetz, hai sicuramente coperto il miglior materiale disponibile fino ad oggi.

Andando avanti, ci sono i nuovi miglioramenti della concorrenza in Java 7. Più in particolare il framework Fork / Join e le nuove API NIO asincrone.

Java 8 introdurrà ulteriori miglioramenti della concorrenza con lambdas / collezioni parallele.

Un'altra cosa da considerare seriamente sono i modi alternativi di gestire la concorrenza. Per essere sinceri, l'approccio 'lock mutable objects' di Java sarà sempre soggetto a errori, indipendentemente da quanto siano migliorate le API. Quindi consiglio di guardare il modello degli attori di Scala e lo STM di Clojure come modi alternativi per affrontare i problemi di concorrenza mantenendo l'interoperabilità con Java.

[avviso - > autopromozionale] Quindi raccomanderò naturalmente il nostro prossimo libro, Lo sviluppatore Java ben fondato , che copre tutte le cose che ho menzionato sopra: -.) [/ avvertimento]

Per non dimenticare, Groovy ha anche una Gpars molto raccomandata, non l'ho usata personalmente però.

    
risposta data 13.09.2011 - 17:45
fonte
2

Il linguaggio di programmazione D fornisce due paradigmi per la programmazione simultanea, entrambi hanno i loro usi e sono piuttosto interessanti.

std.concurrency fornisce il passaggio di messaggi senza alcuna condivisione di memoria predefinita. Tutte le variabili globali e statiche in D sono thread-local per impostazione predefinita e spawn e send non consentono l'invio di messaggi contenenti indirette di puntatore mutevole. La condivisione limitata può essere ottenuta tramite la parola chiave shared , che comporta un controllo aggiuntivo da parte del sistema di tipi. Al di fuori del dialetto sicuro della lingua è possibile forzare le variabili globali / condivise in stile C / Java classico utilizzando la parola chiave __gshared , ma tutte le scommesse sono disattivate per quanto riguarda la sicurezza della gara. Questo modello è dettagliato in un capitolo gratuito del libro di Andrei Alexandresu "The D Programming Language".

std.parallelism è meno sicuro ma in qualche modo più flessibile di std.concurrency e è orientato in modo specifico verso i dati multicore e il parallelismo dei task per aumentare il throughput dell'elaborazione dei dati piuttosto che la concorrenza del caso generale. È dotato di un ciclo foreach parallelo, chiamate di funzioni asincrone, riduzioni parallele, ecc. Fornisce meccanismi per rendere più facile scrivere codice sicuro per la gara, ma farlo richiede ancora un certo grado di disciplina.

Una discussione più approfondita sui due principali paradigmi multithreading in D può essere trovata in il mio recente articolo sull'argomento .

    
risposta data 14.09.2011 - 22:19
fonte
2

Ti suggerisco caldamente di andare a dare un'occhiata a Clojure

L'approccio alla concorrenza è molto nuovo e, a mio avviso, un progresso significativo su ciò che si vede in Java e nella maggior parte degli altri linguaggi. Alcuni punti chiave:

  • Identità e stato sono separati - OOP rispetta l'identità dell'oggetto con il suo stato corrente sotto forma di variabili membro modificabili. Clojure separa strettamente l'identità (riferimenti gestiti) e lo stato (strutture dati immutabili) in un modo che semplifica notevolmente lo sviluppo di programmi concomitanti affidabili.
  • Strutture dati permanenti e immutabili : poiché tutto è immutabile, puoi scattare un'istantanea di dati / stato in qualsiasi momento e assicurarti che non subirà alcuna modifica al di sotto di te. Ma meglio di così: sono strutture dati persistenti che condividono i dati con le versioni precedenti. Di conseguenza, le operazioni sono molto più vicine a O (1) piuttosto che a O (n) che si paga per una strategia copy-on-write per dati immutabili.
  • Memoria transazionale del software - anziché utilizzare i blocchi, devi solo racchiudere il codice in un blocco (dosync ...) e vengono eseguiti automaticamente come una transazione. Nessun rischio di deadlock e nessuna necessità di sviluppare strategie di blocco complesse. Questa è una vittoria enorme, specialmente se combinata con le strutture di dati immutabili di cui sopra. In effetti, Clojure implementa controllo della concorrenza multi-versione nel suo STM.
  • Il paradigma Programmazione funzionale viene utilizzato per semplificare la scrittura di codice concorrente affidabile. Fondamentalmente se si prende una struttura di dati immutabile, eseguirla attraverso una pura funzione e generare una diversa struttura di dati immutabile, allora il codice è sicuro per essere sicuro per la concorrenza.

Suggerirei guardare questo video come introduzione

    
risposta data 25.11.2011 - 10:11
fonte
1

Dai un'occhiata al linguaggio di Scala, che estende Java e funziona sulla JVM. Prende in prestito la nozione di "attori" di Erlang e offre buone capacità per gestire i fallimenti di concorrenza.

    
risposta data 13.09.2011 - 18:38
fonte
1

Se vuoi portarlo a un livello completamente nuovo, potresti voler esaminare la programmazione con CUDA .

Questo ti permette di distribuire i tuoi algoritmi su centinaia di core di elaborazione sulla tua scheda grafica piuttosto che sui pochi core della CPU principale. Esistono anche Collegamenti linguistici che a quanto pare rendono relativamente facile accelerare i linguaggi di alto livello come python usando GPGPU tecniche.

    
risposta data 13.09.2011 - 20:18
fonte
1

Programmazione della concorrenza su JVM: Mastering Synchronization, STM e attori discute simultaneamente programmazione in Scala, Clojure, JRuby e Groovy.
Avrai una comprensione abbastanza solida dei diversi approcci per la concorrenza.

Dov'è il tuo sorriso?

    
risposta data 25.11.2011 - 17:23
fonte

Leggi altre domande sui tag