Press "Enter" to skip to content

GOTO 2014 • New Concurrency Utilities in Java 8 • Angelika Langer


ok benvenuto a questo discorso su nuovo
questa è la utilità di concorrenza in Java 8
un discorso per i programmatori Java posso tranquillamente
presumere che tu abbia familiarità con
programmazione concorrente in Java che è
non va bene, va bene
quindi quello di cui discuteremo è ottenere un
panoramica della nuova concorrenza
utilità aggiunte a Java 8
imparerà come risultato asincrono
elaborazione hanno aggiunto un nuovo
struttura o nuova classe il completabile
futuro che è un’alternativa al
futuro normale che è stato aggiunto con Java
5 ed è in un certo senso un modo diverso
di elaborare i risultati che sono
prodotto da thread contemporaneamente in esecuzione
un’altra astrazione che è stata aggiunta
in Java 8 è il blocco dello stelo che è un
blocco alternativo e in particolare è
un’alternativa al blocco del readwrite
disponibile da Java 5
poi c’è un’altra aggiunta vale a dire
errori e accumulatori sono simili
Atomica lunga atomica in generale più
di queste aggiunte alla concorrenza
le utilità sono modi per fornire
ottimizzazioni quindi c’è a malapena
qualcosa di radicalmente nuovo, ma la maggior parte di questi
nuove astrazioni supportano le ottimizzazioni
e andrò in alcuni dei dettagli
ci sono un paio di nuovi metodi in
sono state aggiunte le mappe hash concorrenti
in realtà per l’interfaccia della mappa così uniforme
le singole mappe di hash della mappa con hash
supportare nuove operazioni e lo sono
particolarmente interessante per concorrenti
mappa hash perché tutti questi aggiuntivi
le operazioni su una mappa hash sono atomiche se
li usi su una mappa hash concorrente
poi c’è una particolare nuova mascotte a
nuovo pool di thread è una singola fork / join
pool di thread che viene utilizzato in vari
contesti è usato da flussi in Java
è usato da un futuro completo e anche
da parte della mappa hash concorrente
operazioni che hanno
aggiunto all’interfaccia e parlerò
su come questo pool comune così chiamato
piscina comune differisce dal normale
forcella / join piscine e livelli molto bassi così
stiamo lavorando sulla nostra strada da un livello superiore
astrazioni nel profondo nel
interni del programma concorrente loro
è stata aggiunta un’annotazione
ha sostenuto che è in Java ora in alcuni
miscele non sicure è molto basso livello
e dovrebbe sostenere evitando
condivisione errori va bene così aggiungere un paio di
cose per l’introduzione mi alleno
per vivere la maggior parte del tempo così ho
un paio di seminari uno di loro è un
programmazione simultanea di seminari in Java
ed è per questo che seguo ciò che sta succedendo
su Java e nel JDK okay
iniziare con un futuro futuro completo in
generale è un meccanismo per passare a
risultato prodotto da un concorrente
eseguire l’attività a una parte interessata
un altro thread in genere ed è stato
aggiunto inizialmente anche Java 5 e non c’è
un’interfaccia futura che descrive cosa
il futuro è fondamentalmente il centro
operazione è ottenere il risultato e il futuro
compito è la classe di implementazione che era
aggiunto in Java 5 e erano principalmente
progettato per l’uso con gli strumenti della discussione diamo
dai un’occhiata al modo di usare Java 5
futuro quello che fai in Java 5 sei tu
creare un pool di thread , quindi specificare a
callable o runnable quale sono stato
specificando qui è un’espressione lambda
quindi invii il callable o eseguibile
alla piscina e alla piscina immediatamente
lo avvolge in un compito futuro e ritorna
un futuro ok il compito in sé è ancora
seduto nella coda delle attività di quel pool
e puoi usare il futuro e a
in particolare la funzione di gate dei futures su
aspetta che il risultato attenda
completamento del risultato e una volta voi
ricevere il risultato dal cancello
a proposito è la funzione di gate
un blocco
funzione se l’attività è ancora in esecuzione
e il risultato non è stato ancora prodotto
quindi aspetti che il risultato sia
disponibile e quindi puoi usarlo nel mio
esempio sto semplicemente stampando ciò che il
la limitazione di ciò è che tu hai come a
utente del futuro devi attivamente
decidere quando si desidera recuperare il
risultato e in particolare si potrebbe avere
aspettare fino a quando il risultato è disponibile
c’è così tanto fino a quando Java 8 non ci fu
nessun modo di specificare una sorta di a
Chronos studente risultato elaborazione in modo da te
agisci a turno in tutti i casi che devi
andare e chiedere attivamente il risultato sono
hai familiarità con i lambda che sono stato
usando il lambda senza nemmeno chiedere chi
non ha familiarità con le espressioni lambda
pochi clip lambda è fondamentalmente il nostro nuovo
funzione del linguaggio in Java 8 e nel
la parte gialla nella mia dichiarazione di presentazione è a
lambda lambda è fondamentalmente un anonimo
funzione e se si guarda la sintassi
ha il simbolo della freccia nel mezzo
e a sinistra hai un
la lista degli argomenti è come l’argomento
elenco di un metodo e a destra voi
avere l’ implementazione del metodo come il
corpo di un metodo ed è una sorta di
metodo anonimo eppure non ha un
nominalo ha solo un elenco di argomenti e un
implementazione e questo è yeah e in
il mio esempio a cui sto fornendo un callable
la funzione di invio della mia piscina quindi
lambda magicamente in qualche modo implementa il
interfaccia richiamabile e fondamentalmente
corrisponde a quello che siamo stati di solito
fare con anonimo nei nostri corsi sì
quindi il lambda è una specie di conciso
notazione per cose che siamo stati
risolvendo in precedenza con anonimo nel nostro
classi
okay, ho usato bene il nuovo
o molte delle nuove API sono in Java che uso
la nuova funzionalità quindi lo farò in tutto il
parlare usa lambda in vari posti ok così
la limitazione del futuro classico è
nessun supporto per qualche tipo di reattivo
risultato elaborando ciò che effettivamente eravamo
manca è che possiamo specificare un qualche tipo
delle funzioni della sacca di base di
di funzionalità che verrà eseguita
non appena il risultato diventa disponibile
elaborazione dei risultati asincrona e questo
è ciò che fornisce il futuro completato
futuro completabile è una classe in
java.util e il pacchetto simultaneo
combina la classica interfaccia futura ok
quindi puoi usare un futuro completabile come
un compito futuro e basta usare il blocco
ottenere la funzione per recuperare il
risultato ma implementa anche un nuovo
interfaccia chiamata fase di completamento e
la fase di completamento ha un paio di dozzine
di funzioni molti di loro per
Recupero dei risultati asincroni come in
l’esempio qui , supponiamo che
Ho ricevuto un futuro completabile
Andrò in come puoi recuperare
futures completabili in un minuto
e una volta che avrò un futuro completo, io
può usare la funzione gate e attendere
il risultato ma in alternativa posso usare
l’allora accetta la funzione e quello che sono
specificando c’è una funzionalità che
verrà eseguito non appena il risultato
è prodotto e non devo aspettare
quindi accetta la funzione solo con le mani
funzionalità e quindi il thread che
sta producendo il risultato sta eseguendo il
compito e produrre il risultato sarà
successivamente chiamo il mio lambda che ho
stato fornito per poi accettare
funziona come un argomento e
in fondo quello che sto facendo è stato il
il risultato è disponibile quindi si prega di stamparlo
quindi non devo aspettare, sì, solo
rendere disponibili alcuni tipi di
funzionalità che verrà eseguita
esattamente quando il risultato diventa
disponibile ed è eseguito in modo asincrono
in una discussione diversa, quindi non devo
aspetta che non debba ricontrollare ciecamente
fino a quando il risultato non sarà disponibile
Ho appena specificato in anticipo cosa farà
essere fatto una volta che il risultato diventa
disponibile a posto sto lasciando aperto
da dove ho avuto quel futuro completabile
e vengono anche creati futuri completabili
passando compiti
Tipo di Zoar percorribile di colobus in piscina
ma non è fatto usando la piscina
in particolare e chiamando un mittente
eseguire invece la funzione completabile
il futuro ha funzioni di fabbrica statiche o
metodi di fabbrica a cui fornite il vostro
attività e quindi restituisce un completabile
futuro ci sono due gusti diversi
di erano questi metodi di fabbrica statici uno
è costruttori precursore e questi metodi
si chiamano run async e gestiscono uno studente
con un esecutore in modo da poter specificare in
quale pool verrà eseguito il runnable
se non si specifica un pool da soli
quindi viene utilizzata la piscina comune del giunto a forcella
che entrerò in un minuto dopo
okay, così puoi passare le nostre abilitazioni
ciò che viene restituito è un futuro completabile
di erboristeria vuota non producono a
risultato e quindi cosa è possibile specificare a
reazione a sarebbe il completamento di
il runnable senza ricevere o
elaborare qualsiasi risultato se si dispone di a
risultato producendo compiti che
tradizionalmente abbiamo espresso come
un callable che chiameresti offerta
creazione e passaggio in un’implementazione
dell’interfaccia fornitore il fornitore
l’interfaccia è una nuova fase di interfaccia e
è stato aggiunto in congiunzione con il
flussi che fanno anche parte di java
jdk e c’è un nuovo pacchetto chiamato
ti java a una funzione e ha a
coppia di funzioni predefinite
interfacce che vengono in genere utilizzate come
i tipi di argomento delle operazioni di flusso
o come in questo esempio è usato come
il tipo di argomento della fornitura asincrona
funzione e un fornitore il fornitore
l’interfaccia è un’interfaccia funzionale
le interfacce funzionali ne hanno una sola
metodo astratto e il metodo astratto
un fornitore non prende nulla come un
argomento ma produce o fornisce a
risultato e in questo caso questo è simile
a un callable ricorda il colobo di colobo
non prendere argomenti ma producono
su un risultato la differenza tra a
callable e un fornitore è
se ricordi il callable è il nucleo
il metodo è autorizzato a controllare
eccezioni in particolare ed esecuzione
eccezione e tutte le API che sono
usando lambda hai difficoltà con
controllate le eccezioni, quindi oggigiorno tutto il
i lambda sono in genere privi di controllo
eccezioni e quindi il fornitore ha un
funzione che non produce argomenti
un risultato ma non getta alcun segno di spunta
eccezioni quindi fondamentalmente è un
eccezionalmente callable quindi ancora questi due
sapori qui di passare un compito a entrambi
la piscina comune Fortran o una piscina di
la tua scelta e poi ciò che viene restituito è
il futuro completo che ti permette
utilizzare la tradizionale cancello sincrono
Funziona così il futuro classico
interfaccia tutta la fase di completamento
funziona come uno zoom o poi
accetta e ce ne sono molti altri
funzioni che permettono di specificare
reazioni al recupero dei risultati
va bene confrontando le opzioni
questo è il vecchio modo di farlo sì
utilizzare attivamente il futuro e decidere ora io
voglio aspettare il risultato e poi tu
ottenere il risultato e processi in qualche modo
e il modo reattivo usando completabile
futuro è iniziare un’attività o passarla a
un po ‘di piscina e poi immediatamente
dopo ricevo il futuro e poi
Specifico la reazione che viene eseguita
al risultato l’evento che il risultato
diventa disponibile ok il completabile
il futuro come pure un bel numero di nuovi
API che sono stati aggiunti al JDK con
Java otto usa il cosiddetto fluente
stile di programmazione e programmazione fluente
significa che hai un’API in cui
quasi tutte le operazioni
restituire un oggetto su cui è possibile
eseguire la prossima operazione in una catena di
operazioni in modo che ogni operazione ritorni
qualcosa o che puoi eseguire
operazione successiva e ho usato un
esempio qui puoi avere breve
sequenze di operazioni o qualche tipo di
lunga up
come la parte inferiore qui sto fornendo un
chiamabile a qualche tipo di pool del chiamante
chiama uno stock in modo completo che
in qualche modo recupera dato un simbolo azionario
recupera una stringa che contiene
informazioni sullo stock quando
completa così una volta che quella stringa ha
è stato prodotto quando completo, ho appena stampato
ciò che è stato recuperato come risultato
e quando completo restituisce anche a
futuro completo su cui posso chiamare
la prossima operazione e poi noi poi io
diciamo applicare un tasso di incremento dell’estratto
metodo per il risultato del magazzino
informazioni e poi ne estrae alcune
tipo di raddoppiare il tasso aumentato andiamo
diciamo una volta che il tasso di aumento della velocità è
prodotto ora è anche un completabile
futuro con un letto Io lo chiamo un
tranne la funzione e quindi formatto il
determinare il tasso di aumento e stamparlo
e dopo ho una specie di
metodo di terminazione che è poi eseguito
e quindi eseguire è uno dei metodi che
non restituire più un futuro completo
quindi è un po ‘la fine della mia sequenza
sì, la politest asincrono alimentazione eseguire il
compito nessuna fornitura Aysen passa solo il
compito per un pool di thread sì è come
inviare o eseguire con il tradizionale
pool di thread
è appena passato alla piscina che la piscina mette
in una sorta di coda di attività e
lì si siede fino a quando un filo è
disponibile per eseguirlo quindi questo non è un
funzione di blocco sì , basta passare
oltre il compito e restituisce il futuro
subito
Potrei finire il compito prima di specificare
quindi tranne in teoria si così se la piscina
se una minaccia nel pool è disponibile e
eseguilo immediatamente e ci vuole
solo nanosecondi per procedere poi bene
il risultato sarebbe diventato disponibile
immediatamente e poi immediatamente
dopo tutte le reazioni dell’IDI
essere eseguito in modo da completare un futuro
gestisce questo caso in particolare così
non c’è bisogno di prendere tempo
non necessariamente ok ma di solito intendo
si passa su compiti ad un pool di thread che
in genere richiede un po ‘di tempo sì sì
di solito hai finito con la fornitura
tutte le reazioni prima del compito anche
funziona in genere okay, qual è il grande
trattare con reagire con questo tipo di
stile reattivo voglio dire è così
fornisce scalabilità più elevata perché con
un modo tradizionale di recuperare il
risultato in genere devi aspettare
e stai perdendo tempo ad aspettare
il risultato o puoi aspettare con il tempo
oh fuori, che è fondamentalmente polling e
allora ti dici spreco di risorse per
perché il cieco rifiuta i molti rifiuti
finché non ricevi effettivamente il risultato
e con il futuro completo tu
non vorresti perdere tempo da te
non devi ricontrollare che non devi
ti aspetto basta specificare che tipo di
la reazione è eseguita proprio al momento
quando il risultato diventa disponibile è
fondamentalmente come fornire una richiamata
è invocato sull’evento del risultato
completamento okay la prima volta che ho guardato
all’interfaccia sono stato sopraffatto
perché ne ha tre o quattro dozzine
metodi quindi ci sono molte operazioni
la maggior parte di questi sono per il cosiddetto risultato
utenti e ci sono metodi che derivano
dalla classica interfaccia futura
hanno aggiunto un paio di logiche
estensioni al futuro classico
interfaccia quindi abbiamo le fabbriche
come fornire Osric e correre come collegamento che
Ti ho mostrato che ha tutto
la funzione di completamento per
fornendo reazione
e poi ha operazioni di massa come fanno
qualcosa dopo tutti questi futuri
completo o uno qualsiasi di questi futures
completo quindi ha davvero un grasso
Interfaccia, credo che ne vada un altro paio
dettagli non c’è solo allora tranne
funzione per specificare le reazioni ma
ci sono tre diverse funzioni voi
dopo che hai ricevuto un
un futuro completabile puoi dire allora
applica una funzione quindi accetta un consumatore
o poi eseguire una eseguibile la differenza
in pratica, diciamo prendiamo allora
accettarlo prende un consumatore e un
il consumatore è qualcosa che prende il
il risultato in qualche modo lo consuma lo elabora
e non restituisce nulla in modo che il
risultato sarebbe un futuro completabile di
decadere se si utilizza quindi applicare quello che dovete
fornire una funzione e una funzione è
qualcosa che prende il risultato e
produce un nuovo risultato o qualcos’altro
questo tipo di mappe il risultato per qualche tipo
di nuovo oggetto o informazione così
ritorna completamente ci vuole un T e
restituisce un futuro completabile per te
è una specie di funzione di mappatura e
quindi eseguire esegue una eseguibile e come te
sanno correre di noi non prendere nulla non
restituire tutto ciò che è proprio come voglio
un naufragio al completamento senza
ricevere il risultato senza farlo
qualsiasi cosa con esso e io non ritorno
qualsiasi cosa così restituisce il completabile
futuro di vuoto quindi ci sono questi tre
sapori diversi di fornire a
reazione e ognuno di questi tre esiste
in tre diversi gusti che rende
per il fet api sono loro la combinazione
è già in nove diverse funzioni
i tre gusti differenti qui usando
l’esempio di loro eseguito è quindi eseguire il
correre sopra la reazione in modo sincrono a
in modo sincrono o asincrono con a
pool specifico a mia scelta e fondamentalmente
qual è la differenza se dici allora
eseguire in modo sincrono quindi la minaccia
tipicamente una minaccia da pool che è stata
produrre il risultato verrà eseguito anche
il runnable che è stato fornito e
se dici allora esegui Aysen
un altro pool inserisce un nuovo thread di pool a
thread del pool diverso eseguirà il
eseguibile in modo che un thread eseguisse il file
compito prodotto il risultato iniziale e
allora un runnable sarà avviato in a
thread diversi e puoi anche iniziare
il runnable in un thread diverso in a
piscina diversa se vuoi bene così tu
hanno nove diverse funzioni per
fornendo varie reazioni in vari
sapori quindi ci sono più funzioni
come per le combinazioni sì, se vuoi
reagire al completamento di due
diversi futuri c’è un poi
esempio di funzione combinata qui fornisco
un callable o tipo di un callable che è
chiamato ottenere un simbolo azionario giornaliero più basso
tasso e un altro per il più alto
tasso in modo da avere due futuri per diverso
esecuzioni di due compiti diversi e
due risultati diversi e ho intenzione di farlo
fare qualcosa al termine di entrambi, quindi io
Prendi uno dei futures allora
combinato con l’altro futuro e a
reazione che prende entrambi i risultati e
produce qualcosa di nuovo nel mio esempio I
basta calcolare la differenza giornaliera
basso e giornaliero alto e quindi il risultato
di nuovo è un futuro completabile del doppio
nel mio caso probabilmente e poi applico a
funzione di formattazione che stampa così
puoi avere combinazioni di futures e
reagire al completamento di diversi
cose sì sì, è possibile combinare più di
due futuri c’è un tutto di funzione
a cui fornite una collezione di
fornitori o anibali e poi lo faresti
reagire al completamento di tutti loro
e anche su nessuna funzione va bene
questa è una specie di panoramica del
dozzine di funzioni sì, tu hai il
i metodi di fabbrica forniscono Aysen dove si trova a
eseguire un lavandino con una piscina e con rock
con piscine esterne o sapori diversi
ognuno di loro quindi hai l’allora
applica quindi accetta quindi esegui le cose
tre sapori
ancora un altro nove funzioni per
specificando le reazioni che hai
funzioni per specificare la reazione
in caso di fallimento sì sì, quando completo
gestire e eccezionalmente eccezionale
viene chiamato se l’attività genera un runtime
gestore di eccezioni riceve entrambi
risultato se ha avuto successo e il
eccezione se andava bene se falliva
sì, allora può produrre una reazione
la maniglia può produrre un risultato di sostituzione
mentre quando completato non restituisce a
risultato basta prendere il risultato nel caso
di successo l’eccezione in caso di
fallimento e quindi produce un qualche tipo di
reazione quindi c’è una pipeline quindi
comporre interessantemente questo è fondamentalmente
la mappa piatta una sorta di mappa piatta
operazione che esaminerà il
interfaccia di streaming c’è una mappa piatta
funzione e questo è fondamentalmente ciò che il
la cosa corrispondente per il
futuro completabile e poi ci sono
combinazioni quindi combinate e accettate
entrambi corrono dietro entrambi i vari sapori di
combinando due futures e poi c’è
il tutto si apre per più di due
Futures quindi questa è la fase di completamento
interfaccia reattiva di un futuro completabile
e quindi supporta il tradizionale
roba futura come ottenere e cancellare ed è
fatto e hanno un po ‘logico
estensioni del futuro c’è un get
ora che ritorna immediatamente se il
il risultato è disponibile finora se si
voleva che tu dovessi chiamare con Paul
un timeout molto breve ora tu
avere una funzione che ritorna ora
immediatamente uno e hai un join
funzione che è fondamentalmente un ottenere
funzione senza un’eccezione controllata così
avvolge l’eccezione se l’ attività
fallito in un’eccezione di runtime
di un’eccezione di esecuzione controllata
altrimenti è proprio come ottenere
la funzione cancel è divertente in cui entrare
questo in un mini e in un minuto è
appena supportato perché il futuro
l’interfaccia ha sempre avuto una funzione di annullamento
ok allora c’era un’altra parte del
API che io chiamo l’ API del provider di risultati
questo è per le persone che vogliono tornare
futuri completabili da soli
funziona così quello che stavamo cercando
fino ad ora è stato dimostrato da qualcuno
con il futuro più completo e io voglio
per usare il futuro completo in ordine
per specificare tutte le mie reazioni ma potrei
anche essere un fornitore di risultati io così sono
fornendo un’API che restituisce a
futuro completabile per qualcosa così sono
fornire futuri completabili agli utenti
della mia API e poi cosa farò
è necessario fornire un futuro che è
inizialmente vuoto e quindi devo fare
disposizioni che il risultato è calcolato
e che il futuro è completato al più presto
come il risultato diventa disponibile cosa
sembra che diciamo che voglio
implementare AE ottenere la funzione della pagina web sì
riceve l’URL e quindi lo è
supposto per fornire il contenuto di quello
pagina web come una stringa e dal momento che prende
tempo sì per accedere all’URL e leggere tutto
il contenuto e lo inserisce in una stringa I
voglio fornire un futuro completo così
che l’utente della mia funzione get pagina web
non devo aspettare si, potrei
implementalo e aspetta solo l’utente
fino a quando la primavera diventa disponibile allora
la mia funzione get pagepage restituirà a
stringa ma quello sarebbe un blocco
funzione che richiede molto tempo e se io
voglio renderlo più conveniente per il mio
gli utenti che dico ok vi offro un
fase di completamento diciamo che questo è
fondamentalmente un futuro completabile per a
stringa e quindi è possibile specificare tutto il tuo
reazioni senza aspettare il
completamento del risultato e dentro quella
funzione avrei dovuto creare un vuoto
futuro ancora incompleto quindi devo impostare
ora in qualche modo il calcolo dei risultati
che deve essere impostato in modo che
alla fine completa il futuro e
poi tornerò il futuro anche prima
il risultato esiste sai che il
l’utente può già iniziare a specificare tutto
le reazioni nel codice sorgente sembra
così questa è la mia pagina web get
funzione restituisce un completo di a
mettere in scena un modello di un futuro o a
fase di completamento della stringa che creo
un futuro completabile vuoto che è
chiamando il costruttore poi ho impostato
il calcolo dei risultati quindi l’ho impostato
eseguibile che chiama una pagina di lettura bloccante
funzione
sì e blocchi che richiede molto tempo
tempo una volta fatto
si ritorna con il contenuto del
pagina web come una primavera devo essere sicuro
che il percorribile è la sua ultima azione
completa il futuro c’è un completo
la funzione futura ha una funzione completa
esattamente per questo scopo e poi
riempie il risultato del blocco della lettura
il futuro e se fallisce c’è a
completa eccezionalmente dove puoi
passare l’eccezione e poi hai
fare disposizioni che questo compito questo
runnable è eseguito così l’ho passato a
una specie di piscina e poi restituisco il
futuro vuoto finora sono appena stato
impostando il runnable quindi passandolo
a un pazzo compito probabilmente non è ancora arrivato
correndo e restituisco il futuro vuoto a
il mio utente e l’utente possono prendere il futuro
e inserire o specificare tutto il
reazioni al completamento di questo
futuro ok quindi questo è se si vuole
interfacce di design che restituiscono
Futures completabili in tal senso
sarebbe un produttore di risultati invece di a
risultato utente ok ci sono questi due
funzioni complete e complete
eccezionalmente per completare un vuoto ancora
futuro ok quindi se si confrontano le attività future
il modo Java di implementare i futures
e in un futuro completo c’è una chiave
la differenza di attività futura è in realtà a
combinazione di futuro e un compito esso
conosce il compito che ha fatto conosce il
compito che produce il risultato mentre
il futuro completabile disaccoppia il
consegnare il meccanismo di ciò che è il
le caratteristiche future e il compito
l’esecuzione di un futuro completabile no
sapere nulla del compito che esegue
e produce il risultato che rende
risultati divertenti perché intendo con il futuro
compiti la funzione di annullamento aveva senso
perché potresti annullare l’attività mentre
stava correndo
un futuro completabile ha una funzione cancerosa
e puoi chiamarlo ma il risultato è
solo che il futuro sarebbe tornato
eccezionalmente e il compito è ancora
correre e produrre il risultato così
dal momento che non conosce il cancro del compito
è una specie di discutibili sì quindi vorrei usare
di solito se usi lo stile reattivo
e aiuta la programmazione benestante a dargli uno stile
non ti verrebbe mai in mente di chiamarti
annullare in primo luogo interrupt
la tua corsa intendi se non posso cancellare
su un completo di un futuro lo fa
interrompe l’attività no lo fa perché
non conosce l’ attività il compito è giusto
vivo e funzionante e continua a fare
fino a quando non finisce da solo Oh nessuno
interessato al risultato più è
una cattiva idea di chiamare annullare direi
si si può certamente derivare dal
sovrascrittura di attività future completabili
cancellare con qualsiasi semantica ritenga
ragionevole per te che è certamente
realizzabile
sì, ma l’ implementazione di default solo
finisce o completa il futuro
eccezionalmente sì e va bene così
bene
eventuali ulteriori domande riguardo
futuro completabile altrimenti mi sto muovendo
alla prossima astrazione la prossima
è il blocco del blocco del fermo temporaneo come ho detto è un
alternativa al readwrite re-entrant
bloccare l’idea del classico Java 5
il blocco del readwrite reentrant è quello che vuole
consentire l’esecuzione simultanea di lettori
e vuole solo sincronizzare il
combinazione di thread di lettura e
scrivere discussioni o scrivere discussioni con
altri scrittori sì, se ne hai diversi
leggere gli eccessi conquistare gli accessi in lettura a
le strutture dati che non hanno bisogno
sincronizzazione, ma se usi il
blocco del rientro irregolare o il
blocchi sincroni si bloccherebbe anche
o i lettori bloccheranno altri
lettori e per evitare questo non
sincronizzazione necessaria di un lettore
con un altro lettore ri-partecipante
blocco di lettura / scrittura ha solo una modalità in cui
diversi lettori possono accedere ai dati
gli scrittori sono bloccati sì e no
blocca la combinazione di due scrittori
e lettori e scrittori ma lettori
da solo può correre in parallelo e il timbro
lock è una sorta di estensione ad esso
o è molto simile al blocco del timbro
internamente è costituito da un numero di versione
il francobollo che fornisce questo era
parte del nome e del nodo interno
se il blocco del timbro è in lettura scrivere
modalità scrittura o modalità ottimistica
ottimista
modalità di lettura questo è ciò che rende il
differenza tra la lettura di rientro
blocco di lettura che è sempre un pessimista
legge pessimistica significa e voglio
acquisire la serratura e voglio essere sicuro
che ci che ho le forze se io
acquisire il lucchetto giusto che voglio fare
sicuro di avere accesso esclusivo al
dati nessun altro scrittore nessun altro
Posso eseguire questo è quello che mi aspetto di a
Pessimista in punto allo stesso modo se acquisisco
un blocco di lettura pessimista che voglio
assicurati che solo i lettori siano in esecuzione
e nessuno scrittore è in esecuzione e che cosa
fornisce il blocco dello stent è un ottimista
modalità di lettura e questo consente
ottimizzazioni in basso contenuto locale
situazioni di tensione dove ci sono solo
pochissime minacce e non ce n’è quasi nessuna
accesso simultaneo ai dati e quindi I
voglio provare a leggere i dati senza
in realtà acquisendo il blocco lo farò solo
Spero solo per il migliore si in un
modalità ottimistica ho letto i dati afferrarlo
ma non posso essere sicuro di averlo davvero avuto
l’ accesso esclusivo ad esso devo
convalidare in seguito e assicurarsi che
non vi era alcun accesso simultaneo che il
optare per il mio approccio ottimistico era giustificato
e questo approccio ottimista ha
esibisce prestazioni migliori a meno che non
fallisce sì, vediamo così internamente
mantiene un timbro ogni volta che acquisti
ti viene presentata una serratura di un francobollo
e devi mantenere quella radice fino a te
sbloccare o rilasciare il blocco e se il
timbro è 0 significa che non hai ricevuto
la serratura quindi la posizione non è andata a buon fine allora
ha la giusta modalità che è a
modalità di scrittura pessimistica come con il
blocco re-entrant fa in modo che il
la minaccia che acquisisce il blocco del timbro
in modalità destra è l’unico l’ unico
minaccia quando ha accesso esclusivo a
i dati vanno bene in quella modalità se ce n’è uno
filo nella giusta modalità quindi nessun lettore può
corri ogni tentativo di acquisire un
blocco di lettura ottimista fallirà sì
garantisce davvero l’accesso esclusivo a
i dati quindi abbiamo la modalità di lettura
questa è la stessa modalità di lettura con simile
che abbiamo con il nuovo entrante
il blocco readwrite consente non esclusivi
accesso perché puoi avere Tara Lily
correndo i lettori giusti sono gli scrittori
bloccato ma i lettori possono essere eseguiti in parallelo
quindi non hai accesso esclusivo
perché stai solo leggendo i dati
e anche altri thread sono autorizzati a farlo
leggere i dati contemporaneamente questo è
esattamente come con il rientro
abbiamo provato Locke e poi c’è questo
ottimista leggere l’ umore e l’ottimista
leggi cos’è una versione estremamente debole
di un look da leggere sto solo dicendo okay
proverò una lettura ottimistica e
dopo leggerò semplicemente sì no
importa se c’è concomitante
accesso o meno e dopo aver letto lo farò
chiedi in che cosa si trova il loro concorrente
tra il momento in cui ho annunciato che lo farò
leggere e fino a quando ho chiesto se fosse
valido e la modalità di lettura ottimistica può
essere rotto in qualsiasi momento, quindi se ce n’è uno
discussione dicendo ok io sono ottimista
la lettura di altri lettori può unirsi a ciò che è
non un problema, ma anche altri scrittori
aderire e modificare i dati che il
il thread di lettura ottimistica è
attualmente leggendo e in quel caso
probabilmente stai leggendo incoerente
dati metà modificati metà non si
quindi è necessario convalidare poi andiamo
dare un’occhiata a un esempio va bene questo
Ad esempio, il classico ri-attore ha letto bene
sì blocco pessimistico hai dati
vuoi sincronizzarlo usando a
readwrite lock e l’idea è che usi
la parte destra del lucchetto per la modifica
funzioni e la parte di blocco di lettura per tutti
funzioni di sola lettura è il classico
modo di farlo
puoi leggere e scrivere blocco pessimista
fare lo stesso con l’aspetto del blocco del timbro
leggermente diverso sì, si crea un
timbro ogni volta che acquisisci un lucchetto
sì, avresti acquisito un blocco di scrittura e
un blocco di lettura ricevi un timbro e tu
necessario utilizzare il timbro e passarlo al
funzione di sblocco corrispondente altrimenti
è esattamente lo stesso del rientro
readwrite lock entra in gioco la nuova roba
posto quando voglio provare un ottimista
leggere non ottimista è per
prominente per sequenze di lettura brevi di
leggere l’accesso ai dati che dovrebbero essere
segmenti di codice molto brevi perché il
più tempo ci vuole per leggere i dati del
più probabile è che ci sia
accesso simultaneo in scrittura tra e
che alla fine fallirai così
questo è quello che sembra i miei dati
consiste di due tipi primitivi di interi
interi parte 1 e parte 2 ho una radice
orologio e ora voglio leggere
ottimisticamente quindi dico di provare ottimismo
leggere
il loro bar sto sto annunciando okay lo farò
prova una lettura ottimistica e lo farò in seguito
chiamare una funzione di convalida e quindi per favore
dimmi se c’è stata una conquista e
Esiste il diritto tra così leggo il
due numeri interi che è un codice molto breve
segmento di lettura e poi convalido
quando ho chiesto era lì mentre ero
leggere era una specie di
accesso simultaneo in scrittura
se è così i dati possono essere incoerenti ora
potresti aver letto un intero
prima della modifica dell’altro
in seguito e tutti i dati incoerenti
che è inutile quindi la convalida può
fallire se ha successo sì, allora puoi farlo
basta usare i numeri interi locali e
calcolarli e prenditi il ​​tuo tempo
perché ora lavori a livello locale
copie dei dati effettivamente interessanti
se fallisce sì, avrebbero potuto essere
concomitante destra XS tra e
validare ti direbbe falso che non è riuscito
esisteva un concomitante quindi è possibile
sì, è necessario produrre un qualche tipo di
reazione una cosa che puoi fare è un tentativo
potresti girare su un loop e riprovare fino a quando
che alla fine ci riesci o puoi
ripiegare troppo pessimista rinchiuso
che è quello che sto facendo qui, non appena
la validazione fallisce ciò che è
fondamentalmente il messaggio va bene
ci sono scrittori concorrenti i tuoi dati
è incoerente io acquisisco il
blocco di lettura pessimista e acquisizione del
blocco di lettura pessimista significa che sto aspettando
fino a quando tutti gli scrittori non saranno andati, sì e poi
Ricevo la garanzia che solo
i lettori saranno attivi mentre io sono
leggendo la prima parte e la seconda parte del
dati interessanti e poi si hanno
per sbloccare il blocco di lettura e quindi posso
di nuovo calcola quello che voglio
calcolare in base ai dati sì cinque
minuti rimanenti
mmm, va bene così tanto per quanto riguarda il blocco
ha anche tecniche ottimistiche di aggiornamento
se si desidera eseguire l’aggiornamento da un blocco di lettura
a un blocco di scrittura che è anche a
differenza rispetto al normale rientro
riscrivi gli accumulatori dei lavoratori
gli accumulatori non sono non estremamente
interessante
è fondamentalmente un’alternativa al
blocco atomico del tommix che conosci Atomics
sono usati per
o blocca la programmazione gratuita che non vorresti
utilizzare qualsiasi tipo di serrature per ottenere
accesso esclusivo a un valore lungo per
istanza, ma invece useresti
un blocco atomico e l’utilizzo sempre atomico
significa che stai leggendo il valore corrente
con una sola operazione atomica di te
calcola un nuovo valore basato sul
valore precedente e mentre sei
calcolo che potrebbe essere di nuovo
concomitante diritto di accesso ai dati che
hai letto e per farlo
facendo un po ‘simile al convalidare
che abbiamo appena fatto un a
operazione di confronto e confronto swap
significa ok se c’è ancora il
precedente valore precedente, quindi si prega di ignorare
con un nuovo valore e se il vecchio valore
c’è più di quello che c’era
eccesso concomitante giusto allora fallisce
e ti dice sì e poi in genere
con una reazione atomica lunga a
l’errore è una ripetizione di tentativi in ​​un ciclo
fino a quando riuscirai a fare l’atomico, Long è nostro
filo sicuro e utilizzato per bloccare senza
programmazione di bloccare l’accesso gratuito a un lungo
per esempio c’è un problema con
l’atomico a lungo diciamo che c’è spazio
per ottimizzazioni che la lunga era
fornisce se hai molti thread
accedendo all’atomico per molto tempo, lo faranno
fallire molto spesso e gireranno abbastanza
un po ‘in un ciclo finché non hanno successo e
al fine di evitare questi tentativi di latenza
hanno fornito il lungo errore e il
l’ errore lungo non mantiene un singolo
prestito che esiste contemporaneamente ma esso
ha diverse celle atomiche quindi si divide
il contenuto effettivo del valore reale effettivo
in vari Long
quindi se un thread vuole aggiungere qualcosa
per l’errore atomico lungo o lungo e
una delle celle è attualmente sotto a
eccesso concomitante eppure solo uno dei
le celle non contattate vengono aggiornate in modo che
fondamentalmente l’intero risultato
non viene prodotto finché non hai effettivamente chiesto
per il contenuto dell’errore lungo così
fondamentalmente cerca di ridurre la contesa
e l’errore di accesso fallito mediante splitting
in diverse celle in modo che uno
fetchers
aggiunge il valore a una vendita non trattata
e solo se recuperi il risultato il
il valore reale effettivo è calcolato in modo da te
hanno ventilato incremento e decremento
funzioni che non restituiscono nulla
che è diverso dal lungo atomico
atomic long ha un get e un incremento
funzione restituisce il valore bene questo
uno non restituisce il valore fino a te
chiedi dammi la somma sì e poi quello
somma su tutte le celle questo è il
lungo sommatore
la doppia Edda è la stessa cosa e
gli accumulatori sono solo a
generalizzazione puoi fornire un
funzione di accumulazione che non devono essere
calcolando la somma si si potrebbe
calcolare il prodotto o qualsiasi altra cosa
qualunque sia il diverso tipo di accumulazione
vuoi fare ok mappa di hash simultanea
ha un sacco di estensioni interessanti voi
può esaminare la scagnozzo concorrono ha
stato riorganizzato internamente i secchi
non sono più liste ma sono alberi
se il tipo di chiave è comparabile quale è
fondamentalmente un’ottimizzazione per i tipi chiave
che hanno scarse funzioni di hash così è
una cosa interiore e poi ha
funzioni aggiuntive e questo supplementare
la funzione esiste nella mappa regolare
interfaccia così ad esempio hai un
funzione di calcolo e calcolo
la funzione calcolerà la chiave e il
valore fornisci una funzione che può
calcolare il valore per un dato tasto così
non fornisci la chiave e il valore
per fornire la chiave e una funzione
calcola il valore ci sono calcolati
epsilon calcola se presenti funzioni e
c’è un esempio qui dove sto usando
calcolare se assente dato un elenco di
stringhe Voglio produrre una mappa hash a
mappa hash concorrente a cui si associa
mangiare ogni stringa la frequenza in cui
appare nella mia lista di Springs ok così io
crea una mappa hash simultanea di stringa
e lungo sommatore il contatore diventa il
contatore di frequenza e poi loop sopra
tutte le stringhe nella mia lista di stringhe
e poi computo se assente sì sì se
Ho trovato una stringa sì, se quella stringa ha
non è stato ancora aggiunto come chiave in din a
la mappa
Vorrei calcolare il primo valore il
valore iniziale che è un nuovo lungo sommatore
con il quale è stato inizializzato da lungo tempo
valore zero e viene restituito il nuovo valore
dal computer assente così faccio il sif
parola appare per la prima volta ho
produrre una coppia di valori chiave con la stringa
e un nuovo sommatore lungo che contiene 0 il
il sommatore lungo viene restituito e si incrementa
la prossima volta che appare la parola è
non più assente si e poi solo il
Il valore associato viene restituito e io
incrementalo in questo modo il risultato è a
elenco di parole e un contatore di parole e tutto
queste operazioni su sono atomiche con a
garanzia simultanea di hash map
atomico il lato o diciamo uno dei
i requisiti sono che stai rimappando
le funzioni non richiedono molto tempo sì
altrimenti sarebbero bloccando l’accesso
a determinati segmenti della mappa di hash e
ci sono piccole di questa funzione emergente
si lo sono per ogni ricerca di ridotto
funziona in quattro gusti quindi dodici
ulteriori nuovi metodi tutti atomici
metodi in una mappa hash concorrente ok
saltiamo un paio di dettagli
piscina comune che ho già menzionato
un pool comune che viene utilizzato in tutti i casi
lo stiamo facendo dove non lo fornisci
un pool esplicito come per se tu se tu
fornire una eseguibile per il completabile
volti futuri o i flussi anche loro
usa la piscina comune e quella è una singola
piscina a forcella singola con giunto a forcella singola
il pool è pool statico di fork / join che è
preconfigurato sì, ce n’è solo uno
per le operazioni di streaming per tutto il
casi in cui è necessario un pool, ma farlo
non specificarne uno da soli
differisce da un normale fork / join pool
tramite inizializzazione pigra, quindi inizia con
no thread e quindi costruisce un numero di
discussioni e riduce il numero di
fili come non sono più necessari
ha una dimensione predefinita preconfigurata che
è disponibile processo come meno uno lì
sono proprietà gemelle che puoi cambiare
quel valore in modo da poter cambiare la dimensione di
il pool e il comportamento di spegnimento è
diverso è fondamentalmente un pool di demoni
discussioni così come l’ultimo utente
thread termina tutti i thread del pool
sono automaticamente terminati che possono
produrre alcuni problemi se sei stato
passaggio
compiti per dire il futuro completabile o
operazione di streaming qui e lo faresti
in realtà hanno ancora bisogno del comune
pool ma l’ ultimo thread utente termina quando
il pool si spegne automaticamente e
i tuoi compiti non saranno più eseguiti così
questo richiede qualche tipo di misurazione
devi aspettare fino a quando la piscina è stata
eseguito tutte le attività che si passano a
prima ancora l’ultimo thread utente
esegue non c’è una domanda di peso
funzione per fare esattamente questo aspetta
per un avviso di piscina vuota tutte le minacce sono
non fare nulla per fare sì, allora puoi
attendo questo particolare stato della piscina
e quindi terminare il twist per tutta la vita
conteso come due minuti due minuti
va bene due minuti per il contenuto conteso
è molto molto di basso livello
in realtà si rivolge a false condivisioni e
la condivisione falsa significa che tu conosci il
tu hai l’architettura di
CPU multi-core usano che usano parecchio
le cache causano le cache collegate a a
certo core e tu spesso hai
cache gerarchiche e l’idea è se
un oggetto intendo se si tratta di oggetti o dati
è inserito nella cache e in un thread
modifica il denaro e altri thread vogliono
per vedere la modifica ci deve essere
lampeggia e si aggiorna nel main
memoria questo è ciò che il modello di memoria di
Java è circa e le nostre regole del modello di memoria
per la sincronizzazione e per volatile e
poi per i campi per i finali hanno anche
regole che vanno bene
ma puoi eseguire quanto segue
problema in genere se si dispone di una classe
come il mio punto
ha due campi interi quali
il compilatore cerca di fare è di imballare tutto il
contenuto di un oggetto densamente insieme
sì per risparmiare spazio per salvare
memoria quindi l’intero oggetto con entrambi
gli interi finirebbero nella stessa cache
linea di una determinata chiamata va bene se uno dei
due campi è un campo caldo diciamo che lo è
un campo volatile e ne ha bisogno
accesso concorrente e ha bisogno di molti
svuota e rinfresca quindi tipicamente il
l’intera linea della cache diventa calda se si
bit o un intero all’interno di quella cache
la linea ha bisogno di svuotare e aggiornare cosa
l’hardware funziona se scarica e
Aggiorna l’intero l’intero cache
linea ogni volta che si accede
anche se è accessibile su un campo freddo
sì, i piedi freddi non hanno nemmeno bisogno del
altri svuota e rinfresca ma il
tutta la linea della cache sì, perché c’è
un volatile o non compilato il
l’intera riga della cache viene aggiornata e svuotata
e aggiornare tutto il tempo quindi se uno di
i campi è un caldo uno Ivalo a lei uno
sì, si innesca arrossendo e rinfrescando
ogni volta che qualcosa in quella linea della cache è
esiste e questa è una performance
impedimento sì ma il caching è
supposto per aumentare le prestazioni
stai facendo il contrario se lo hai
campi di carbone e campi caldi nello stesso
linea di cache e ciò che il conteso
l’annotazione sta cercando di farlo provare
campi di codice separati dai campi caldi si
in modo da poter contrassegnare le cose calde con il
annotazione contesa e cosa JVM
fa è inserisce i byte di riempimento in
per assicurarsi che i campi di carbone
sono su una linea della cache, se lo sono
non è stato effettuato il flushing e l’aggiornamento
necessario e il campo caldo si trova in
un’altra linea della cache e ogni volta che lo è
accesso poi a tutto il necessario lavaggio
e il rinfresco è fatto ma è fatto
solo allora solo se accedo al campo caldo
e il contenuto è diverso
aromi per mangimi singoli per gruppi per
interi oggetti tutti i campi di un oggetto
è molto molto di basso livello
se non sai cosa fai con esso
allora probabilmente non ne hai bisogno
sì è usato all’interno del JDK
implementazioni per esempio se guardi
nella piscina della forcella in un giunto completo
raggruppare ogni filo
è il tuo lavoro tu e il lavoro tu
dovrebbe essere thread specifico sì ed è
una classe contesa sì sì che tu no
avere condivisione dei guasti perché ci sono
diversi lavori utilizzati nella stessa riga della cache
e tu creeresti arrossire e
rinfrescante indipendentemente da quale filo
eccessi che fanno la fila ok che è un
esempio okay qualsiasi domanda quindi prima di
tutto grazie, ne abbiamo già alcuni
domande in linea da quando ha già preso
alcuni dal pubblico durante il discorso I
vorrebbe prendere questo uno così uno
la domanda è ora nell’esempio con
dovrebbe essere il nuovo blocco per i campi
volatile o dovrebbe il campo prima che a
nell’esempio con il nuovo blocco dovrebbe
i campi sono volatili
probabilmente sta affrontando il blocco temporaneo
nell’esempio con blocco timbro ora se
non usi il timbro dei campi
essere volatili perché la serratura è una serratura
sì, ogni blocco si assicura che lì
sono scarichi e rinfreschi che a
garantire la visibilità del
modifiche che sono fatte sotto il
protezione della serratura quindi non è necessario
essere volatili okay ne abbiamo un’altra
domanda con cui in precedenza è un
domanda ma non penso che tu possa
rispondi è più come direttamente a
Oracle quindi forse un’altra domanda per
il pubblico che è uno
Ho imparato che usando le classi da
il pacchetto Sun è un grande no-go come
ufficiale è questa annotazione che è
ufficiale è una parte ufficiale della
Oracle JDK sì e se ne hai bisogno se
costruisci persone di astrazioni di basso livello
lo stanno usando ma non è per tutti i giorni
programmazione quindi è ufficiale ma la maggior parte
probabilmente non sarà necessario in più
casi quindi è fondamentalmente parte o è
fornito per gli implementatori della libreria o
altre persone che costruiscono librerie o
quadri della loro stanza così è
ufficiale ma sì ancora non dovresti esserlo
usarlo ok ok vi ringrazio molto ok in
molte informazioni interessanti su nuove
roba in Java 8 che era una specie di
affogato nel rumore generato da
Lambda spero di vederti tra pochi minuti
per ultimo discorso per oggi
tu

Please follow and like us: