1
00:00:01,580 --> 00:00:03,670
Ciao, questo è che non vuoi farlo.

2
00:00:03,980 --> 00:00:07,100
Lo abbiamo visto in alcuni scenari in un ambiente multi-thread.

3
00:00:07,340 --> 00:00:14,200
Le cose possono funzionare in modo imprevedibile in quanto è un ular strutturato che gestisce tutto, di conseguenza abbiamo

4
00:00:14,200 --> 00:00:20,620
discusso sulla condizione di rischio che potrebbe accadere quando i thread condividono alcuni dati mutabili e abbiamo visto

5
00:00:20,620 --> 00:00:23,390
come la Sincronizzazione può aiutare in questo.

6
00:00:23,660 --> 00:00:25,110
Utilizzando la sincronizzazione.

7
00:00:25,240 --> 00:00:32,200
Possiamo far funzionare le cose in una scrittura più ordinata in Java, abbiamo qualcosa chiamato il modello di

8
00:00:32,200 --> 00:00:33,250
memoria Java.

9
00:00:33,480 --> 00:00:39,760
E tu trovi questi signori auditing la malta è parte della specifica del linguaggio Java ed

10
00:00:39,760 --> 00:00:41,660
è correlata al multi-threading.

11
00:00:41,710 --> 00:00:47,080
È bene essere consapevoli di ciò quando eseguiamo la programmazione multithread in particolare quando

12
00:00:47,080 --> 00:00:49,630
si tratta di dati mutabili condivisi.

13
00:00:49,660 --> 00:00:50,990
Non è roba complicata.

14
00:00:51,130 --> 00:00:54,350
Sono solo alcune regole di cui dobbiamo essere consapevoli.

15
00:00:54,580 --> 00:01:00,460
In questa conferenza vedranno quali sono le regole dei dati in un evento nel seguito che esploreranno alcune

16
00:01:00,490 --> 00:01:01,840
delle cose rilevanti.

17
00:01:03,890 --> 00:01:06,290
Si può chiamare un leggero dalla nostra struttura precedente.

18
00:01:06,380 --> 00:01:13,730
Questo è il cattivo esempio di John unadopt visitatore John e Anita sono pronunciati da bootlace che sono entrambi

19
00:01:13,820 --> 00:01:15,610
attivi allo stesso tempo.

20
00:01:15,830 --> 00:01:23,180
Quindi Jon Stewart potrebbe mettere in difficoltà Dolma sporcando il saldo del nuovo su di esso allo stesso tempo non controllato.

21
00:01:23,180 --> 00:01:28,290
Potrebbe anche accedere al metodo di bilanciamento sulla scena che Bangkit non può obiettare.

22
00:01:28,670 --> 00:01:31,180
Ma molto non ha visto il tutto per niente.

23
00:01:31,520 --> 00:01:36,980
Quindi non c'è alcuna garanzia che lo faccia oggi vedrà la necessità di discutere e se

24
00:01:36,980 --> 00:01:44,270
non vede il valore più recente significa che nel sistema che sta entrando in uno stato non corretto essenzialmente abbiamo qui la

25
00:01:44,270 --> 00:01:45,310
condizione di competizione.

26
00:01:46,840 --> 00:01:54,380
Una ragione per cui è sufficiente leggere che vede che tutto il valore potrebbe essere dovuto ad azioni fuori ordine, ad esempio.

27
00:01:54,480 --> 00:01:59,930
Potrebbe essere che Jon Stewart si trovi all'interno del metodo di prelievo e conosca anche il controllo del saldo.

28
00:02:00,330 --> 00:02:07,360
Ma poi va in corsa subito prima di abradire l'equilibrio, un atto non abituato diventerebbe acto, il che significa che sarebbe

29
00:02:07,360 --> 00:02:14,020
in stato di esecuzione a Dunwich vedere tutto su di te in bilico dato che non è aggiornato.

30
00:02:14,590 --> 00:02:19,390
Ma potrebbe non aver voluto che la sequenza di azioni fosse in questo modo.

31
00:02:19,440 --> 00:02:22,390
C'è un interleaving di azioni.

32
00:02:22,400 --> 00:02:27,830
La ragione è ovviamente che uno è un metodo sincronizzato mentre l'altro non

33
00:02:27,830 --> 00:02:33,020
è sincronizzato e non sappiamo mai come leggere dovrebbe essere eseguito correttamente.

34
00:02:33,020 --> 00:02:38,520
Un altro motivo può essere quindi che abbiamo a che fare con un sistema multiprocessore che condivide la memoria.

35
00:02:38,770 --> 00:02:42,040
Ma proprio quello che i sistemi più moderni sono qui.

36
00:02:42,050 --> 00:02:51,300
Ogni processore ha la propria cache locale periodicamente e riconcilia la memoria condivisa in modo che lo stret possa trovarsi su un processore e

37
00:02:51,300 --> 00:02:58,230
potrebbe eseguire il completamento documentato in modo che esegua completamente la marca con Dolemite che la nuova

38
00:02:58,280 --> 00:03:05,790
quantità di saldo possa essere scaricata nella cache locale e quindi anche alla memoria principale comunque non controllata che

39
00:03:05,900 --> 00:03:12,170
potrebbe essere su un altro processore, potrei leggere il valore di bilanciamento sulla cache locale che

40
00:03:12,170 --> 00:03:14,980
ha solo valore non ancora aggiornato.

41
00:03:15,350 --> 00:03:21,770
Quindi fattori come questo in tutte le azioni che abbiamo visto prima possono impedire a una

42
00:03:21,770 --> 00:03:24,670
minaccia di vedere i valori aggiornati.

43
00:03:24,680 --> 00:03:27,320
Quindi fondamentalmente c'è mancanza di coordinamento.

44
00:03:27,450 --> 00:03:34,350
E se ricordi nella lezione precedente hai detto che ha qualcosa a che fare con le prestazioni.

45
00:03:34,440 --> 00:03:39,870
La maggior parte delle volte non ha bisogno di cose proprie e non è necessario

46
00:03:39,960 --> 00:03:46,590
comunicare con altre minacce che comunicano con altre parole su ogni operazione di scrittura ed è costoso e potrebbe

47
00:03:46,590 --> 00:03:52,830
diventare davvero pessimo in un sistema multiprocessore con memoria condivisa a causa alla necessità di aggiornamenti frequenti che

48
00:03:52,830 --> 00:03:57,470
devono avvenire tra il loop e la memoria e la memoria condivisa.

49
00:03:58,770 --> 00:04:05,270
La coordinazione è necessaria solo quando lo stato mutabile è condiviso tra le tracce come un avviso John su

50
00:04:05,620 --> 00:04:06,560
un esempio.

51
00:04:06,740 --> 00:04:09,770
Ma lo stato immutabile è la variabile di equilibrio.

52
00:04:10,230 --> 00:04:15,750
Quindi, se non vi è alcuna condivisione di notabili, non vi è alcun motivo per coordinare tra

53
00:04:15,780 --> 00:04:17,840
le minacce, nonostante eventuali operazioni corrette.

54
00:04:17,850 --> 00:04:23,340
Allo stesso modo, se hanno a che fare con oggetti del mare completamente diversi nelle nuvole, ancora una

55
00:04:23,510 --> 00:04:26,360
volta la coordinazione potrebbe non essere affatto necessaria.

56
00:04:27,600 --> 00:04:34,620
Ma se c'è uno stato condiviso che è degno di nota, è responsabilità del programma, non GBM, assicurarsi

57
00:04:34,620 --> 00:04:38,020
che venga chiamato interrompere lo stato di merda.

58
00:04:38,390 --> 00:04:41,470
OK, quindi tutto questo è per le prestazioni del seacock.

59
00:04:43,410 --> 00:04:49,800
Un modo per garantire che il clinico sia sincronizzato è che è molto difficile farlo.

60
00:04:49,860 --> 00:04:55,450
E abbiamo visto questo nella lezione precedente fare il loro ottenere equilibrio è anche sincronizzato no.

61
00:04:55,480 --> 00:05:02,880
JON STEWART HOST La sorella di Axel, Nick the Dortmunder, che non è abituata a non avere problemi di equilibrio

62
00:05:02,880 --> 00:05:09,960
sotto Jon Stewart, fa il cane come sappiamo che in ogni istante di tempo solo un thread può intrattenere

63
00:05:10,040 --> 00:05:13,100
il metodo sincronizzato di un oggetto condiviso.

64
00:05:14,530 --> 00:05:19,800
Ha detto che le due azioni Jon Stewart e lasciare il marchio con il metodo Dorling e su

65
00:05:19,810 --> 00:05:23,890
di esso vanno a quello e ottenere l'equilibrio come accade prima della relazione.

66
00:05:24,080 --> 00:05:29,510
Jon Stewart e ottenere MC con tutti succede prima che lo faccia in un buon equilibrio.

67
00:05:30,440 --> 00:05:39,860
E questo accade prima che il rapporto anche quello che appena letto vede solo le ultime novità sui batas Quindi quello che succede prima che

68
00:05:39,870 --> 00:05:45,360
il rapporto che abbiamo appena visto è raggiunto attraverso la sincronizzazione e questa nozione

69
00:05:45,360 --> 00:05:52,440
di prima è parte del lavoro ha perso più memoria e la JVM implementa la memoria appena persa più

70
00:05:52,440 --> 00:05:58,780
su soap e vede la parola chiave sincronizzata che sa che c'è bisogno di coordinazione di interconnessione.

71
00:05:59,010 --> 00:06:05,850
Per questo inserisce speciali barriere di memoria per le istruzioni che installano l'architettura sottostante Gugu

72
00:06:06,060 --> 00:06:11,580
per coordinare la memoria necessaria tra la cache e la memoria condivisa.

73
00:06:12,520 --> 00:06:19,310
Si noti che nel nostro esempio bancario per essere al mio posto la barriera della memoria subito dopo che il thread di John è

74
00:06:19,360 --> 00:06:21,910
uscito fa la parte centrale sotto il lucchetto esistente.

75
00:06:22,060 --> 00:06:23,180
O potrebbe farlo.

76
00:06:23,220 --> 00:06:28,420
Poi ho notato che il lucchetto è chiuso per ottenere un buon bilanciamento.

77
00:06:28,420 --> 00:06:35,480
Quindi il momento esatto in cui GBM inserisce la barriera di memoria dipende dall'implementazione specifica di GBM al di sotto

78
00:06:35,500 --> 00:06:40,900
di esso non è specificato nel modello di memoria Ajalon che, come abbiamo detto prima,

79
00:06:40,900 --> 00:06:48,830
fa parte delle specifiche del linguaggio Java in modo che l'accadimento prima di ordinare possa essere sicuro che i risultati sono l'azione

80
00:06:48,830 --> 00:06:54,050
giusta da un thread o devono essere visibili ad una reazione da un editore.

81
00:06:54,290 --> 00:06:59,620
Solo se l'operazione corretta avviene prima dell'operazione di lettura, non il lavoro.

82
00:06:59,640 --> 00:07:07,320
Nessuno specifica che alcuni scenari o regole si verificano prima che avvenga l'ordine e la sincronizzazione è solo

83
00:07:07,320 --> 00:07:08,680
una di queste.

84
00:07:08,700 --> 00:07:10,630
Diamo un'occhiata ai diversi scenari.

85
00:07:11,800 --> 00:07:13,980
Il primo è basato sull'ordine del programma.

86
00:07:14,020 --> 00:07:20,790
Questo avviso che ogni azione in un determinato thread avviene prima di ogni altra azione che

87
00:07:20,840 --> 00:07:22,540
viene dopo e durante.

88
00:07:22,690 --> 00:07:28,900
Il secondo è basato sulla fortuna, che è quello che abbiamo discusso con il nostro esempio di sincronizzazione

89
00:07:29,020 --> 00:07:33,990
che rilasciando ilok avviene prima di ogni successiva acquisizione di quella stessa logica.

90
00:07:34,390 --> 00:07:40,510
Sapete che esempio se si effettuano prelievi e si cammina velocemente allora esiste la minaccia Ajani che

91
00:07:40,510 --> 00:07:46,390
limita rilascia la serratura che viene poi acquisita da non abituata al fine di ottenere l'equilibrio.

92
00:07:46,480 --> 00:07:51,530
Non che se le azioni indeterminate giuste usano blocchi diversi allora ciò non è accaduto prima delle

93
00:07:51,620 --> 00:07:53,500
relazioni tra le due azioni.

94
00:07:53,500 --> 00:07:54,770
Quindi tienilo a mente.

95
00:07:54,820 --> 00:08:02,750
Deve essere il singolo successivo basato sulla variabile volatile che è l'argomento della prossima lezione.

96
00:08:02,750 --> 00:08:08,960
Fondamentalmente volatile è una parola chiave che può essere usata quando si dichiara una variabile

97
00:08:08,980 --> 00:08:16,470
e il diritto a tale variabile avviene prima di ogni successiva lettura di quella variabile indipendentemente dal thread letto.

98
00:08:17,890 --> 00:08:20,500
Poi fa partire una traccia da cosa significa.

99
00:08:20,500 --> 00:08:24,220
È senza carta parcheggiata su un dato thread.

100
00:08:24,480 --> 00:08:32,680
Succede prima di ogni altra azione che si verifica all'interno di quella traccia. Nextel si basa sull'operazione JOIN.

101
00:08:32,680 --> 00:08:40,090
Ciò significa che tutte le azioni in un determinato thread avvengono prima che la traccia ritorni con successo da un

102
00:08:40,090 --> 00:08:41,400
gigante in poi.

103
00:08:43,490 --> 00:08:45,250
Regola di interruzione dei nestors.

104
00:08:45,360 --> 00:08:51,890
Interrupt è un metodo e può essere invocato su una minaccia diretta che dovrebbe interrompere ciò che sta

105
00:08:51,890 --> 00:08:53,370
facendo e fare qualcos'altro.

106
00:08:53,450 --> 00:08:57,730
In genere è una minaccia come mezzo per porre fine alla minaccia.

107
00:08:58,010 --> 00:09:03,470
Per quanto riguarda ciò che accade prima o durante l'atto di una minaccia, il metodo di

108
00:09:03,510 --> 00:09:11,140
interruzione di chiamata su un'altra minaccia avviene prima che la minaccia interrotta rilevi che le donne intrapersonali si metteranno nei guai in seguito.

109
00:09:12,340 --> 00:09:18,460
Il prossimo è la regola del finalizzatore che riguarda il metodo finalizzato e l'oggetto più il

110
00:09:18,460 --> 00:09:23,800
metodo finalize verrà invocato o un garbage collector quando rileva che non ci sono

111
00:09:23,800 --> 00:09:25,160
più riferimenti all'oggetto.

112
00:09:25,220 --> 00:09:31,750
Quindi i cluster di oggetti possono sostituire la materia finalizzata per eseguire qualsiasi operazione di pulitura prima che

113
00:09:31,750 --> 00:09:35,720
l'oggetto sia garbage collector e Gotcha succede prima di ordinare.

114
00:09:35,770 --> 00:09:42,460
La regola è che la fine del costruttore di un oggetto si verifica prima dell'inizio del finalizzatore

115
00:09:42,490 --> 00:09:43,590
per quell'oggetto.

116
00:09:43,680 --> 00:09:44,030
Destra.

117
00:09:44,050 --> 00:09:46,240
Ovviamente questo è ciò che accadrà.

118
00:09:47,990 --> 00:09:55,760
Il prossimo è che tutti i client lo fanno in base all'azione che accade prima che l'azione B dell'azione B avvenga

119
00:09:55,760 --> 00:09:59,560
prima dell'azione C, quindi l'azione avviene prima delle azioni.

120
00:10:00,510 --> 00:10:02,840
Quindi quelle sono le opzioni prima di ordinare.

121
00:10:02,990 --> 00:10:09,270
E credo che le seconde e le terze regole sui blocchi della volatilità, ma le variabili

122
00:10:09,270 --> 00:10:16,820
siano probabilmente quelle che contano davvero per noi, dato che le utilizziamo deliberatamente solo per riassumere queste regole DMM,

123
00:10:16,830 --> 00:10:21,360
assicuriamo che diversi thread abbiano una visione coerente del sistema condiviso.

124
00:10:21,780 --> 00:10:28,170
Questo è il risultato di un'azione corretta da parte di un thread che è garantito che sia visibile per leggere l'azione da un

125
00:10:28,170 --> 00:10:28,860
altro thread.

126
00:10:29,130 --> 00:10:36,600
Solo se accade prima dell'operazione di lettura che avviene prima di ordinare avremmo una condizione

127
00:10:37,490 --> 00:10:42,490
di rischio sul programma sincronizzato concreto senza condizioni di rischio.

128
00:10:42,550 --> 00:10:43,720
Questo è tutto.

129
00:10:43,750 --> 00:10:44,170
Grazie.
