java concurency in practice
TRANSCRIPT
-
8/13/2019 Java Concurency in Practice
1/234
!"#"$%&'())*&'+
,&-)"'./'*!"#$%&'()*
+#,-(#("./
01/23$!.142
01/(52!167(("
8$9#:;1.,(/
813
-
8/13/2019 Java Concurency in Practice
2/234
## 0$9$>1%43""(%4?@%-"$4)#4(
,&0*1
#$%& ''()$*+,$& %'''
!"#$"%&'$()&*""+ ,)))
-".'/,0123'& ,)4
56+7"#3'.81'7$& ,4
-.+/0$)&1&2& 0)3#4,0'3 & 11515 6 78$)9: ;)'$* '?C"?1076'!0G0?.& J
15D5 ?.)$+#= +)$ EF$)9G.$)$ H
(+)0& I&J4 #+K$ 0+L=& 1M-.+/0$) >5 ?.)$+# N+*$09 11
;:9:K(0$)&L(?'0.A0C'$BM 9;
;:;:5$"1)6)$B 9@
;:@:I"6+)78 9J
;:D:N=0?.)78A$0$'#)$(I"6+& 9O
;:H:I)4'7'&&07.>'?C"?1076' ;P
-.+/0$) @5 N.+)'"O PQR$,0= >@
@:9:Q)&)R)3)$B ;@
@:;:>=R3)60$)"707./&602' ;J
@:@:L(?'0.-"7C)7'1'7$ ;S
@:D:F11=$0R)3)$B @9
@:H:A0C'
>=R3)60$)"7
@@
-.+/0$) D5 -3K/3='"O PQR$,0= @S
D:9:T'&)87)780L(?'0.&0C'-30&& @U
D:;:F7&$076'-"7C)7'1'7$ @O
D:@:T'3'80$)78L(?'0.A0C'$B D9
D:D:5..)78V=76$)"703)$B$"/,)&$)78L(?'0.&0C'-30&&'& DU
D:H:T"6=1'7$)78AB76(?"7)G0$)"7>"3)6)'& DO
-.+/0$) C5 ;4'L#'"O ;L3,B= C1
H:9:AB76(?"7)G'.-"33'6$)"7& H9
H:;:-"76=??'7$-"33'6$)"7& HD
H:@:
*3"6+)78
W='='&
07.
$('
>?".=6'?
6"7&=1'?
>0$$'?7
HJ
H:D:*3"6+)7807.F7$'??=2$)R3'
-
8/13/2019 Java Concurency in Practice
3/234
###A@%:(B
(+)0& I&N0)4,04)' O&-3 ,4))$ 0&6//L',+0'3 =& S1-.+/0$) T5 ?+=B E%$,40'3" S>
J:9:/,'6=$)78L0&+&)7L(?'0.& U;
J:;:L('/,'6=$"?V?01'#"?+ UD
J:@:V)7.)78/,23")$0R3'>0?033'3)&1 US
A=110?B S@
-.+/0$) S5 -+",$LL+0'3" +"# N.40#3G" HC
U:9:L0&+-076'330$)"7 SH
U:;:A$"22)780L(?'0.R0&'.A'?4)6' O@
U:@:!07.3)785R7"?103L(?'0.L'?1)70$)"7 9PP
U:D:YQ"3)6)'& 9PD
S:;:A)G)78L(?'0.>""3& 9PH
S:@:-"7C)8=?)78L(?'0.>""3/,'6=$"? 9PJ
S:D:/,$'7.)78L(?'0.>""3/,'6=$"? 999
S:H:>0?033'3)G)78E'6=?&)4'538"?)$(1& 99;
A=110?B 99J
-.+/0$) U5 VW! 6//L',+0'3"= 11S
O:9:K(B0?'N%F&A)783'$(?'0.'.M 99U
O:;:A("?$?=77)78N%FL0&+& 99O
O:@:I"78?=77)78N%FL0&+& 9;9
O:D:A(0?'.T0$0'?C"?1076' 9JP
9;:@:54").)78>'?C"?1076'L'&$)78>)$C033& 9JH
9;:D:-"123'1'7$0?BL'&$)78522?"06('& 9JU
A=110?B 9JO
(+)0& 8I&6#F+ ,$#&?3/',=& 1SM
-.+/0$) 1@ 2 E%/L','0 X3,B= 1S1
9@:9:I"6+07.E''7$?07$I"6+ 9U9
9@:;:>'?C"?1076'-"7&).'?0$)"7& 9UD
9@:@:V0)?7'&& 9UH
-
8/13/2019 Java Concurency in Practice
4/234
-
8/13/2019 Java Concurency in Practice
5/234
9C!=#/)#%13%)/T(K3(/)/N/#%$42(#)/=$/)T(/3.)6#)213)R:(K3$)(R)1,#4#)?DT"7[$T"$()&: CV
=#/)#%1%43""(%4?DT"7[$T"$()&: CX
=#/)#%1:()2$)613.:8($:.14O#J@%)"#%/#4=14O/6("(I1)T((%)"$%)D CX
M#1%43""(%4?1J'7"*892"4:&;@
=#/)#%1%J#%(,(%)1J=14$.-"#,#)#9($%:T(J("(%4(Y$"#$7.(/D S]
=#/)#%
-
8/13/2019 Java Concurency in Practice
6/234
-
8/13/2019 Java Concurency in Practice
7/234
9##C!=#/)#%$.43.$)()2(F$,(Y$.3(+6#4(D QX
=#/)#%1%J3/#%1%43""(%4?@%-"$4)#4(
-
8/13/2019 Java Concurency in Practice
13/234
B###G!-"(J$4(
-)*6"'*R) )2#/6"#)#%-PB5(")&"135)2$)4"($)(:)2(/(J$4#.#)#(/d#%$::#)#1%)1
:(/4"#7#%1%43""(%4? #% -"$4)#4( #/ %1) $% #%)"1:34)#1% )1 41%43""(%4? J1" )2$)W /(( )2( )2"($:#%
-
8/13/2019 Java Concurency in Practice
14/234
#9 0$9$>1%43""(%4?@%-"$4)#4(
>2$5)("/Gb+2"($:F$J()?c$%:SbF2$"#%$%4(..$)#1%$%:F23):16%c:($./6#)2)(42%#K3(/J1"
41%9#%4#%2$5)("/ C]CGc 41%4("%/ #)/(.J 6#)2 (%/3"#%2$5)("C]bR91#:#%2$5)("/CSCQc419("/)15#4/)2$)$"(.#O(.?)17(1J#%)("(/)1%.?)1(B5("#(%4(::(9(.15("/e
(B5.#4#).14O/W$)1,#49$"#$7.(/W%1%7.14O#%?*3
E2#.(,$%?1J)2(2#.:"(%`/;1/5#)$.1J-#))/73"
-
8/13/2019 Java Concurency in Practice
15/234
B9G!-"(J$4(
2/3./&4DA2*33.:"&E>./5"?B"+.%C%)."2/3.A
G)M04* R= &-.&";# D23G$9$M0&RS #)G&9 =TT /24; #29.U54#.R=T 04#.V W%29 U4". 4]Z[ 4R^ZZZZZZ[ 4__V
;2,2.84"6UV[D200&*.42"#+#29.U04#.V[
\
F'.#JJ!#JJ.(W!$""?;$?(/W8$6#:a3"*?%#(4WR%
-
8/13/2019 Java Concurency in Practice
16/234
-
8/13/2019 Java Concurency in Practice
17/234
CS!>2$5)("C@%)"1:34)#1%C]!CDCDRbY("?c!"#(J;#/)1"?1J>1%43""(%4?
$:">.*)@ ,&.)%0('./%&E"#)#%
-
8/13/2019 Java Concurency in Practice
18/234
G 0$9$>1%43""(%4?@%-"$4)#4(
@A@AFGH*)+I;)/*67/3.%)+%6$%&'())*&'+@%)2($%4#(%)5$/)W41,53)("/:#:%`)2$9(15("$)#%
-
8/13/2019 Java Concurency in Practice
19/234
SS!>2$5)("C@%)"1:34)#1% CC!CDGD!(%(J#)/1J+2"($:/
@ADA;*&*6/.3%6J:)*"03E2(%3/(:5"15(".?W)2"($:/4$%"(:34(:(9(.15,(%)$%:,$#%)(%$%4(41/)/$%:#,5"19()2(5("J1",$%4(1J41,5.(B
$55.#4$)#1%/D+2"($:/,$O(#)($/#(")1,1:(.21623,$%/61"O$%:#%)("$4)W7?)3"%#%
-
8/13/2019 Java Concurency in Practice
20/234
U 0$9$>1%43""(%4?@%-"$4)#4(
@J$%$55.#4$)#1%
-
8/13/2019 Java Concurency in Practice
21/234
LS!>2$5)("C@%)"1:34)#1% CG!CDSDT#/O/1J+2"($:/
@ALAN/3
-
8/13/2019 Java Concurency in Practice
22/234
Q 0$9$>1%43""(%4?@%-"$4)#4(
!"#$%&'&()&"*..3/)"$)(/$41,,1%41%43""(%4?2$*$":4$..(:$"$4(41%:#)#1%DE2()2("1"%1)"&-.B$0)&"()3"%/$
3%#K3( 9$.3( 62(% 4$..(: J"1, ,3.)#5.( )2"($:/W $/ "(K3#"(: 7? #)/ /5(4#J#4$)#1%W :(5(%:/ 1% 216 )2( "3%)#,(
#%)(".($9(/)2(15("$)#1%/ 62#42#/%1)$:(/#"$7.(/)$)(1J$JJ$#"/D
!(4$3/()2"($://2$"()2(/$,(,(,1"?$::"(///5$4($%:"3%41%43""(%).?W)2(?4$%$44(//1",1:#J?9$"#$7.(/)2$)
1)2(")2"($:/,#
-
8/13/2019 Java Concurency in Practice
23/234
VS!>2$5)("C@%)"1:34)#1% CG!CDSDT#/O/1J+2"($:/
@%6(..:(/#1%)(B)/6#)42(/ 62(%)2(/42(:3.("/3/5(%:/)2($4)#9( )2"($:)(,51"$"#.?/1
$%1)2(")2"($:4$%"3% $"(,1"(J"(K3(%) #%$55.#4$)#1%/6#)2,$%?)2"($:/W$%:2$9(/#
-
8/13/2019 Java Concurency in Practice
24/234
-
8/13/2019 Java Concurency in Practice
25/234
\S!>2$5)("C@%)"1:34)#1%CS!CDUD+2"($:/$"(P9("?62("(
fUgR%/6("e?(/W73)#)`/%1)$..)2$)4.($"J"1,)2(0$9$:14 ?132$9()1"($:)2(TZ@/5(4D
R "(,1)( 17[(4) ,3/)
-
8/13/2019 Java Concurency in Practice
26/234
C] 0$9$>1%43""(%4?@%-"$4)#4(
-").,TS(&0"5*&."?3
=>.?@(,7A +2"($:F$J()?
=>.?@(,
6A
F2$"#%.?@(,8A >1,51/#%.?@(,BA !3#.:#%
-
8/13/2019 Java Concurency in Practice
27/234
CC
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CU!>2$5)("GD+2"($:
F$J()?
$:">.*)DAJ:)*"0C"6*.+-("2$5//3"5"#/#%
-
8/13/2019 Java Concurency in Practice
28/234
CG 0$9$>1%43""(%4?@%-"$4)#4(
$.)2131""(4)%(// ,($%/ )2$) $ 4.$// 41%J1",/ )1 #)/ /5(4#J#4$)#1%D R
-
8/13/2019 Java Concurency in Practice
29/234
CS
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CU!>2$5)("GD+2"($:
F$J()?
+2"($:/$J(4.$//(/(%4$5/3.$)($%?%((:(:/?%42"1%#*$)#1%/1)2$)4.#(%)/%((:%1)5"19#:()2(#"16%D
DA@A@A=1"5>?*TFC.".*?*33C*)#?*.
@% >2$5)(" CW 6( .#/)(: $ %3,7(" 1J J"$,(61"O/ )2$) 4"($)( )2"($:/ $%: 4$.. ?13" 41,51%(%)/ J"1, )21/( )2"($:/W
.($9#%
-
8/13/2019 Java Concurency in Practice
30/234
CU 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4DADAC*)#?*..:".$%(&.3N*Q(*3.38/.:%(..:*P*'*33")+C+&':)%&/O"./%&A!"#$%!"%&'()
b,2.=89&$;'$%&G)M04* *0$## !"#$%&D2)".4"613%)#%
-
8/13/2019 Java Concurency in Practice
31/234
CL
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CU!>2$5)("GD+2"($:
F$J()?$%: )2(% )$O( $4)#1% 7$/(: 1% )2$) 17/("9$)#1% b4"($)( jcd 73) #% J$4) )2( 17/("9$)#1% 413.: 2$9( 7(41,( #%9$.#:
7()6((%)2()#,(?1317/("9(: #)$%:)2()#,(?13$4)(:1% #)b/1,(1%((./(4"($)(:j #%)2(,($%)#,(cW4$3/#%?*TN"'*$%&0/./%&3/&2"O+,&/./"?/O"./%&
R41,,1% #:#1, )2$)3/(/42(4O)2(%$4) #/ .$*? #%#)#$.#*$)#1%D+2(
-
8/13/2019 Java Concurency in Practice
32/234
CQ 0$9$>1%43""(%4?@%-"$4)#4(
/$J(D@%)2(%(B)/(4)#1%W6(`..41%/#:(".14O#%
-
8/13/2019 Java Concurency in Practice
33/234
CV
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CU!>2$5)("GD+2"($:
F$J()?2/3./&4DAVAC*)#?*..:".F..*5>.3.%$"':*/.32"3.N*3(?.8/.:%(.F0*Q(".*F.%5/'/.+A!"#$%!"%&'()
b,2.=89&$;'$%&G)M04* *0$## !"#$%&D$*84"6
-
8/13/2019 Java Concurency in Practice
34/234
CX 0$9$>1%43""(%4?@%-"$4)#4(
F#%4(1%.?1%()2"($:$)$)#,(4$%(B(43)($7.14O1J41:(
-
8/13/2019 Java Concurency in Practice
35/234
-
8/13/2019 Java Concurency in Practice
36/234
G] 0$9$>1%43""(%4?@%-"$4)#4(
E2(%$9$"#$7.( #/
-
8/13/2019 Java Concurency in Practice
37/234
GC
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CU!>2$5)("GD+2"($:
F$J()?S/4()*DA@A-%%)$%&'())*&'+%6'7"*892"4:&;
-
8/13/2019 Java Concurency in Practice
38/234
GG 0$9$>1%43""(%4?@%-"$4)#4(
+2#/5"(/("9(/)2"($:/$J()?6#)213)3%:3.?$JJ(4)#%
-
8/13/2019 Java Concurency in Practice
39/234
GS
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CL!>2$5)("SDF2$"#%
-
8/13/2019 Java Concurency in Practice
40/234
GU 0$9$>1%43""(%4?@%-"$4)#4(
@% )2($7/(%4(1J /?%42"1%#*$)#1%W )2(41,5#.("W5"14(//1"W$%: "3%)#,(4$%:1 /1,(:16%"#
-
8/13/2019 Java Concurency in Practice
41/234
GL
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CL!>2$5)("SDF2$"#%
-
8/13/2019 Java Concurency in Practice
42/234
-
8/13/2019 Java Concurency in Practice
43/234
GV
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CL!>2$5)("SDF2$"#%W $% $.#(% ,()21: #/ 1%( 621/( 7(2$9#1" #/ %1) J3..? /5(4#J#(: 7? >D +2#/ #%4.3:(/
,()21:/#%
1)2("
4.$//(/
$/
6(..
$/
19(""#:($7.(
,()21:/
b%(#)2("
G94/$.&%1"
%4"$0c#%
>#)/(.JD
-$//#%?/'/.?+F??%8/&4.:*.84#N*6*)*&'*.%=3'">*A!"#$%!"%&'()
G)M04* *0$## =84#L#*$G& WG)M04* =84#L#*$G&UL/&".'2)9*& #2)9*&V W
#2)9*&+9&64#.&954#.&"&9U"&? L/&".54#.&"&9UV W
G)M04* /24; 2"L/&".UL/&". &V W;2'23&.84"6U&V[
\\V[
\\
LADA@AC"6*$%&3.)('./%&-)"'./'*3
=84#L#*$G& #..3/)"$)(/ $% #,51")$%) /5(4#$.4$/( 1J (/4$5( 62(% )2(.84# "(J("(%4(/ (/4$5(/:3"#%
-
8/13/2019 Java Concurency in Practice
45/234
G\
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CL!>2$5)("SDF2$"#%1%%(4)#9#)?cD2""&*.42"
17[(4)/D+2(08!>/5(4#J#4$)#1%:1(/%1)"(K3#"()2$)D2""&*.42"17[(4)/7()2"($:/$J(Df\g
@%)?5#4$./("9("$55.#4$)#1%/W
$)2"($:$4K3#"(/$41%%(4)#1%J"1,)2(511.W3/(/#)J1"5"14(//#%
-
8/13/2019 Java Concurency in Practice
46/234
S] 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4LA^AJ:)*"0$%&6/&*5*&.%62%'"?-)/5/./#*"&0N*6*)*&'*H")/"Y?*3AG)M04* 4". 02$;=8&19CUD200&*.42"R1"43$0T *$";4;$.V W
'29.&;'&.R1"43$0T $"43$0#[4". ")3@$49# ] Z[1"43$0 *$";4;$.& ] ")00[
XX $"43$0# *2"%4"&; .2 3&.82;e ;2"m. 0&. .8&3 *$G&Y$"43$0# ] "&? =9&&'&.R1"43$0TU"&? 'G&*4H&";&9D23G$9$.29UVV[$"43$0#+$;;100U*$";4;$.V[%29 U1"43$0 $ h $"43$0#V W
4% U*$";4;$.& ]] ")00 nn Y*$";4;$.&+4#@2.&".4$0F$.&U$VV*$";4;$.& ] $[&0#& W
$9C+02$;U"&? 1"43$0@$49U*$";4;$.&e $VV[__")3@$49#[*$";4;$.& ] ")00[
\\9&.)9" ")3@$49#[
\
Z$#%)$#%#%
-
8/13/2019 Java Concurency in Practice
47/234
SC
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CL!>2$5)("SDF2$"#%
-
8/13/2019 Java Concurency in Practice
48/234
SG 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4LA@@A,55(."Y?*$?"33;(/?.E(.%6K(."Y?*9&0*)?+/&4EY]*'.3AbI33).$M0&G)M04* %4"$0 *0$## =89&&'.226 W
G94/$.& %4"$0 '&.R'.94"6T #.226 ] "&? E$#8'&.R'.94"6TUV[
G)M04* =89&&'.226UV W#.226+$;;UdF2&dV[#.226+$;;Ud5$997dV[#.226+$;;UdD)907dV[
\
G)M04* M220&$" 4#'.226&U'.94"6 "$3&V W9&.)9" #.226+*2".$4"#U"$3&V[
\\
!(4$3/(5"1
-
8/13/2019 Java Concurency in Practice
49/234
SS
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CL!>2$5)("SDF2$"#%
-
8/13/2019 Java Concurency in Practice
50/234
SU 0$9$>1%43""(%4?@%-"$4)#4(
@%J$4)W #J)2(E20;&9 #%=#/)#%
-
8/13/2019 Java Concurency in Practice
51/234
-
8/13/2019 Java Concurency in Practice
52/234
SQ 0$9$>1%43""(%4?@%-"$4)#4(
LAVAWAC:")/&4EY]*'.3C"6*?+
E2(%(9("?13$4K3#"($"(J("(%4()1$%17[(4)W?13/213.:O%1662$)?13$"($..16(:)1:16#)2 #)D81?13%((:)1
$4K3#"($ .14O7(J1"(3/#%
-
8/13/2019 Java Concurency in Practice
53/234
SV
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CQ!>2$5)("UD
>1,51/#%
-
8/13/2019 Java Concurency in Practice
54/234
SX 0$9$>1%43""(%4?@%-"$4)#4(
,$:( $)1,#4D H% )2( 1)2(" 2$%:W #J )2( 4.$// :1(/ %1) #,51/( $%? /342 41%/)"$#%)/W 6( ,$? 7( $7.( )1 "(.$B
(%4$5/3.$)#1%1"/("#$.#*$)#1%"(K3#"(,(%)/)117)$#%*&0*&.E>*)"./%&3
>.$//#%9$"#$%)/$%:,()21:51/)41%:#)#1%/41%/)"$#%)2(9$.#:/)$)(/$%:/)$)()"$%/#)#1%/J1"$%17[(4)DF1,(17[(4)/
$./12$9(,()21:/6#)2/)$)(7$/(:5"(41%:#)#1%/DM1"(B$,5.(W?134$%%1)"(,19($% #)(,J"1,$%(,5)?K3(3(d$
K3(3(,3/)7(#%)2(^%1%(,5)? /)$)(7(J1"(?134$%"(,19($%(.(,(%)DH5("$)#1%/6#)2/)$)(7$/(:5"(41%:#)#1%/
$"(4$..(:/)$)(:(5(%:(%)f>-0SgD
@% $ /#%
-
8/13/2019 Java Concurency in Practice
55/234
-
8/13/2019 Java Concurency in Practice
56/234
U] 0$9$>1%43""(%4?@%-"$4)#4(
#%)("J$4( $/ $ /?%42"1%#*(: ,()21: )2$) J1"6$":/ )2( "(K3(/) )1 )2( 3%:(".?#%2$5)(" CC /216/ 216 )1 #,5"19( /4$.$7#.#)? )2"13
-
8/13/2019 Java Concurency in Practice
57/234
UC
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CQ!>2$5)("UD
>1,51/#%13%)#%
-
8/13/2019 Java Concurency in Practice
58/234
UG 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4MAMAK%&/.%)Y"3*0H*:/'?*J)"'?*5*&."./%&Ab=89&$;'$%&G)M04* *0$## F2"4.29B&84*0&=9$*C&9 W
bH)$9;&;K7Ud.84#dVG94/$.& %4"$0 F$GR'.94"6e F).$M0&@24".T 02*$.42"#[
G)M04* F2"4.29B&84*0&=9$*C&9UF$GR'.94"6e F).$M0&@24".T 02*$.42"#V W
.84#+02*$.42"# ] ;&&GD2G7U02*$.42"#V[\
G)M04* #7"*892"4:&; F$GR'.94"6e F).$M0&@24".T 6&.52*$.42"#UV W9&.)9" ;&&GD2G7U02*$.42"#V[
\
G)M04* #7"*892"4:&; F).$M0&@24". 6&.52*$.42"U'.94"6 4;V WF).$M0&@24". 02* ] 02*$.42"#+6&.U4;V[9&.)9" 02* ]] ")00 S ")00 h "&? F).$M0&@24".U02*V[
\
G)M04* #7"*892"4:&; /24; #&.52*$.42"U'.94"6 4;e 4". -e 4". 7V WF).$M0&@24". 02* ] 02*$.42"#+6&.U4;V[4% U02* ]] ")00V
.892? "&? I00&6$0196)3&".L-*&G.42"Ud,2 #)*8 IAh d _ 4;V[02*+- ] -[02*+7 ] 7[
\
G94/$.& #.$.4* F$GR'.94"6e F).$M0&@24".T ;&&GD2G7UF$GR'.94"6e F).$M0&@24".T 3V W
F$GR'.94"6e F).$M0&@24".T 9)0. ]"&? E$#8F$GR'.94"6e F).$M0&@24".TUV[
%29 U'.94"6 4; h 3+C&7'&.UVV9)0.+G).U4;e "&? F).$M0&@24".U3+6&.U4;VVV[
9&.)9" D200&*.42"#+)"32;4%4$M0&F$GU9)0.V[\
\
G)M04* *0$## F).$M0&@24". W Xc 54#.4"6 i+p cX \
2/3./&4MAVAK(."Y?*-%/&.$?"33C/5/?").%>$/$+$?.+@24".A
b,2.=89&$;'$%&G)M04* *0$## F).$M0&@24". W
G)M04* 4". -e 7[
G)M04* F).$M0&@24".UV W - ] Z[ 7 ] Z[ \G)M04* F).$M0&@24".UF).$M0&@24". GV W
.84#+- ] G+-[
.84#+7 ] G+7[\
\
MALA@A=1"5>?*TH*:/'?*J)"'
-
8/13/2019 Java Concurency in Practice
59/234
US
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CQ!>2$5)("UD
>1,51/#%+
%6
.:*
2%'"./%&
C*.
,&3.*"0
%6
"`2/#*`
E&*A
G)M04* F$GR'.94"6e @24".T 6&.52*$.42"#UV W9&.)9" D200&*.42"#+)"32;4%4$M0&F$GU
"&? E$#8F$GR'.94"6e @24".TU02*$.42"#VV[\
MALADA,&0*>*&0*&.C.".*H")/"Y?*3
+2(:(.(
-
8/13/2019 Java Concurency in Practice
60/234
UU 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4MA^A[*?*4"./&4J:)*"0C"6*.+.%K(?./>?*9&0*)?+/&4C.".*H")/"Y?*3AG)M04* *0$## B4#)$0D23G2"&". W
G94/$.& %4"$0 54#.Rl&754#.&"&9T C&754#.&"&9#] "&? D2G7J"P94.&199$754#.Rl&754#.&"&9TUV[
G94/$.& %4"$0 54#.RF2)#&54#.&"&9T 32)#&54#.&"&9#] "&? D2G7J"P94.&199$754#.RF2)#&54#.&"&9TUV[
G)M04* /24; $;;l&754#.&"&9Ul&754#.&"&9 04#.&"&9V WC&754#.&"&9#+$;;U04#.&"&9V[
\
G)M04* /24; $;;F2)#&54#.&"&9UF2)#&54#.&"&9 04#.&"&9V W32)#&54#.&"&9#+$;;U04#.&"&9V[
\
G)M04* /24; 9&32/&l&754#.&"&9Ul&754#.&"&9 04#.&"&9V WC&754#.&"&9#+9&32/&U04#.&"&9V[
\
G)M04* /24; 9&32/&F2)#&54#.&"&9UF2)#&54#.&"&9 04#.&"&9V W32)#&54#.&"&9#+9&32/&U04#.&"&9V[
\\
MALALAB:*&[*?*4"./%&S"/?3
Z1/)
41,51/#)(
4.$//(/
$"(
%1)
$/
/#,5.(
$/
B4#)$0D23G2"&".e
)2(?
2$9(
#%9$"#$%)/
)2$)
"(.$)(
)2(#"
41,51%(%)
/)$)(
9$"#$7.(/D ,)3M&9N$"6& #% =#/)#%
-
8/13/2019 Java Concurency in Practice
61/234
UL
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CQ!>2$5)("UD
>1,51/#%
-
8/13/2019 Java Concurency in Practice
62/234
UQ 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4MA@@AJ:)*"03"6*K(."Y?*-%/&.$?"33Ab=89&$;'$%&G)M04* *0$## '$%&@24". W
bH)$9;&;K7Ud.84#dV G94/$.& 4". -e 7[
G94/$.& '$%&@24".U4".fg $V W .84#U$fZge $f^gV[ \
G)M04* '$%&@24".U'$%&@24". GV W .84#UG+6&.UVV[ \
G)M04* '$%&@24".U4". -e 4". 7V W
.84#+- ] -[.84#+7 ] 7[\
G)M04* #7"*892"4:&; 4".fg 6&.UV W9&.)9" "&? 4".fg W -e 7 \[
\
G)M04* #7"*892"4:&; /24; #&.U4". -e 4". 7V W.84#+- ] -[.84#+7 ] 7[
\\
'$%&@24". #%=#/)#%
-
8/13/2019 Java Concurency in Practice
63/234
UV
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CQ!>2$5)("UD
>1,51/#%
-
8/13/2019 Java Concurency in Practice
64/234
UX 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4MA@MAP%&.:)*"03"6*F..*5>..%,5>?*5*&.-(./6"Y3*&.A!"#$%!"%&'()
b,2.=89&$;'$%&G)M04* *0$## 54#.E&0G&9RLT W
G)M04* 54#.RLT 04#. ]D200&*.42"#+#7"*892"4:&;54#.U"&? 199$754#.RLTUVV[
+++
G)M04* #7"*892"4:&; M220&$" G).I%1M#&".UL -V WM220&$" $M#&". ] Y04#.+*2".$4"#U-V[4% U$M#&".V
04#.+$;;U-V[9&.)9" $M#&".[
\\
E2? 613.:%`) )2#/ 61"Ok RJ)(" $..WG).I%1M#&". #/#7"*892"4:&;W "#
-
8/13/2019 Java Concurency in Practice
65/234
U\
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CQ!>2$5)("UD
>1,51/#%
-
8/13/2019 Java Concurency in Practice
66/234
L] 0$9$>1%43""(%4?@%-"$4)#4(
+1,$O(,$))("/61"/(W13" #%)3#)#1%,$?1J)(%7(6"1%
-
8/13/2019 Java Concurency in Practice
67/234
LC
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CV!>2$5)("LD!3#.:#%1,,1% 41,513%: $4)#1%/ 1% 41..(4)#1%/ #%4.3:( #)("$)#1% b"(5($)(:.? J()42 (.(,(%)/ 3%)#. )2(
41..(4)#1% #/ (B2$3/)(:cW %$9#
-
8/13/2019 Java Concurency in Practice
68/234
LG 0$9$>1%43""(%4?@%-"$4)#4(
!(4$3/( )2( /?%42"1%#*(: 41..(4)#1%/ 41,,#) )1 $ /?%42"1%#*$)#1% 51.#4? )2$) /3551")/ 4.#(%)/#:( .14O#%./%&
E(3/(B&*.29J1")2(/$O(1J4.$"#)?#%,$%?1J13"(B$,5.(/W(9(%)213
-
8/13/2019 Java Concurency in Practice
69/234
-
8/13/2019 Java Concurency in Practice
70/234
LU 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4VAWA,.*)"./%&7/00*&8/.:/&C.)/&4$%&'".*&"./%&A!"#$%!"%&'()
G)M04* *0$## E4;;&"I.&9$.29 WbH)$9;&;K7Ud.84#dVG94/$.& %4"$0 '&.RI".&6&9T #&. ] "&? E$#8'&.RI".&6&9TUV[
G)M04* #7"*892"4:&; /24; $;;UI".&6&9 4V W #&.+$;;U4V[ \
G)M04* #7"*892"4:&; /24; 9&32/&UI".&6&9 4V W #&.+9&32/&U4V[ \
G)M04* /24; $;;=&"=84"6#UV WN$";23 9 ] "&? N$";23UV[%29 U4". 4 ] Z[ 4 R ^Z[ 4__V
$;;U9+"&-.I".UVV['7#.&3+2).+G94".0"UdALK!Hh $;;&; .&" &0&3&".# .2 d _ #&.V[
\\
@)("$)#1% #/ $./1 #%:#"(4).? #%91O(: 7? )2( 41..(4)#1%`/ 8$#8D2;& $%: &()$0# ,()21:/W 62#42 ,$? 7( 4$..(: #J )2(
41..(4)#1% #/3/(:$/$%(.(,(%)1"O(?1J$%1)2("41..(4)#1%DF#,#.$".?W)2(*2".$4"#100W9&32/&100W$%:9&.$4"100
,()21:/W$/6(..$/)2(41%/)"34)1"/)2$))$O(41..(4)#1%/$"($"
-
8/13/2019 Java Concurency in Practice
71/234
LL
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CV!>2$5)("LD!3#.:#%
-
8/13/2019 Java Concurency in Practice
72/234
LQ 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4VAZAD2"*)99&".F$G,&.*)6"'*AG)M04* 4".&9%$*& D2"*)99&".F$GRleBT &-.&";# F$GRleBT W
XX I"#&9. 4".2 3$G 2"07 4% "2 /$0)& 4# 3$GG&; %923 lB G).I%1M#&".Ul C&7e B /$0)&V[
XX N&32/& 2"07 4% l 4# 3$GG&; .2 BM220&$" 9&32/&Ul C&7e B /$0)&V[
XX N&G0$*& /$0)& 2"07 4% l 4# 3$GG&; .2 20;B$0)&M220&$" 9&G0$*&Ul C&7e B 20;B$0)&e B "&?B$0)&V[
XX N&G0$*& /$0)& 2"07 4% l 4# 3$GG&; .2 #23& /$0)&B 9&G0$*&Ul C&7e B "&?B$0)&V[
\
H79#13/.?W )2("( #/ /1,( 41/) )1 415?#%
-
8/13/2019 Java Concurency in Practice
73/234
LV
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CV!>2$5)("LD!3#.:#%
-
8/13/2019 Java Concurency in Practice
74/234
LX 0$9$>1%43""(%4?@%-"$4)#4(
M1",3)$7.(17[(4)/W5"1:34("41%/3,(":(/#
-
8/13/2019 Java Concurency in Practice
75/234
L\
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CV!>2$5)("LD!3#.:#%
-
8/13/2019 Java Concurency in Practice
76/234
Q] 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4VA@_AN*3.%)/&4.:*,&.*))(>.*0C.".(33%"3P%..%C8"??%8.:*,&.*))(>.AG)M04* *0$## =$#CN)""$M0& 43G0&3&".# N)""$M0& W
K02*C4"6O)&)&R=$#CT ()&)&[+++G)M04* /24; 9)"UV W
.97 WG92*#=$#CU()&)&+.$C&UVV[
\ *$.*8 UI".&99)G.&;L-*&G.42" &V WXX 9.29& 4".&99)G.&; #.$.)#=89&$;+*)99&".=89&$;UV+4".&99)G.UV[
\\\
VAVAC+&':)%&/O*)3
!.14O#%2$5)("
CUD
R../?%42"1%#*("//2$"(4(")$#%/)"34)3"$.5"15(")#(/e)2(?(%4$5/3.$)(/)$)()2$):()(",#%(/62()2(")2"($:/$""#9#%
-
8/13/2019 Java Concurency in Practice
77/234
QC
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CV!>2$5)("LD!3#.:#%
-
8/13/2019 Java Concurency in Practice
78/234
QG 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4VA@DA93/&4
-
8/13/2019 Java Concurency in Practice
79/234
QS
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CV!>2$5)("LD!3#.:#%
-
8/13/2019 Java Concurency in Practice
80/234
QU 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4VA@MA93/&4'&3$G829&.%;%(&0"$%??*'./%&AG)M04* *0$## K2)";&;E$#8'&.R=T W
G94/$.& %4"$0 '&.R=T #&.[G94/$.& %4"$0 '&3$G829& #&3[
G)M04* K2)";&;E$#8'&.U4". M2)";V W.84#+#&. ] D200&*.42"#+#7"*892"4:&;'&.U"&? E$#8'&.R=TUVV[#&3 ] "&? '&3$G829&UM2)";V[
\
G)M04* M220&$" $;;U= 2V .892?# I".&99)G.&;L-*&G.42" W#&3+$*()49&UV[M220&$" ?$#1;;&; ] %$0#&[.97 W
?$#1;;&; ] #&.+$;;U2V[9&.)9" ?$#1;;&;[
\%4"$007 W
4% UY?$#1;;&;V#&3+9&0&$#&UV[
\\
G)M04* M220&$" 9&32/&UJM`&*. 2V WM220&$" ?$#N&32/&; ] #&.+9&32/&U2V[4% U?$#N&32/&;V
#&3+9&0&$#&UV[9&.)9" ?$#N&32/&;[
\\
!$""#("/$"(1J)(%3/(: #%/#,3.$)#1%/W62("( )2(61"O)14$.43.$)(1%(/)(54$%7(:1%( #%5$"$..(.73)$.. )2(61"O
$//14#$)(: 6#)2 $ -N$%:,(,1"?"(/13"4(/D
R%1)2("J1",1J7$""#(" #/L-*8$"6&9W$)615$")?7$""#(" #%62#42)2(5$")#(/(B42$%
-
8/13/2019 Java Concurency in Practice
81/234
QL
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CV!>2$5)("LD!3#.:#%
-
8/13/2019 Java Concurency in Practice
82/234
QQ 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4VA@WA,&/./"?$"':*F..*5>.93/&4!"#$%"&"&0C+&':)%&/O"./%&A
G)M04* 4".&9%$*& D23G).$M0&R1e BT WB *23G).&U1 $96V .892?# I".&99)G.&;L-*&G.42"[
\
G)M04* *0$## L-G&"#4/&
-
8/13/2019 Java Concurency in Practice
83/234
QV
LGXX!LGXV!LGXQ!LGU\!LGS]!LGG\!LG]]!LCUX!U\CQ!UVGG!UVGC!UVG]!UVC\!UL\U!UL\S!ULQ\!ULQX!ULQV!UL
QQ!ULQL!ULQU!UUGV!UUGQ!UUC]!UU]\!USUL!UGCX!UGCV!UGCQ!UGCL!SQSQ!SQSL!SUQ\!SUQX!SUQL!SULL!SULU
!SULS!SUU\!SGGC!SGG]!SGC\!SGCU!S]L\!S]LX!S]LV!GLSL!GLSU!GC\]!GCX\!GCXX!G CV!>2$5)("LD!3#.:#%
-
8/13/2019 Java Concurency in Practice
84/234
-
8/13/2019 Java Concurency in Practice
85/234
-
8/13/2019 Java Concurency in Practice
86/234
V] 0$9$>1%43""(%4?@%-"$4)#4(
i13 413.: 6"#)( $ )2"($:/$J( 5"1
-
8/13/2019 Java Concurency in Practice
87/234
VCL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/ CV!>2$5)("LD!3#.:#%.?@(,:D +$/OPB(43)#1%
=>.?@(,;D >$%4(..$)#1%$%:F23):16%
=>.?@(,
-
8/13/2019 Java Concurency in Practice
88/234
-
8/13/2019 Java Concurency in Practice
89/234
VSL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/ CX!>2$5)("QD+$/OPB(43)#1%
fCg@%/1,(/#)3$)#1%/W/(K3(%)#$.5"14(//#%2$5)("\D
WA@ADA=1>?/'/.?+$)*"./&4J:)*"036%)J"3
-
8/13/2019 Java Concurency in Practice
90/234
-
8/13/2019 Java Concurency in Practice
91/234
VLL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/ CX!>2$5)("QD+$/OPB(43)#1%
2/3./&4WAMAB*YC*)#*)93/&4"J:)*"0-%%?A*0$## =$#CL-&*).42"P&M'&9/&9 W
G94/$.& #.$.4* %4"$0 4". ,=ENL1A' ] ^ZZ[G94/$.& #.$.4* %4"$0 L-&*).29 &-&*
] L-&*).29#+"&?
-
8/13/2019 Java Concurency in Practice
92/234
VQ 0$9$>1%43""(%4?@%-"$4)#4(
$%:?13)2#%O?13,#-N$%:,(,1"?"(/13"4(/DR%:3/#%
-
8/13/2019 Java Concurency in Practice
93/234
VVL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/ CX!>2$5)("QD+$/OPB(43)#1%
7()6((%DF#%4(L-&*).29/5"19#:($/("9#4()1$55.#4$)#1%/W)2(?/213.:7($7.()17(/23):16%$/6(..W71)2
-
8/13/2019 Java Concurency in Practice
94/234
VX 0$9$>1%43""(%4?@%-"$4)#4(
fQg+#,(":1(/2$9(/3551") J1"/42(:3.#%?%/."Y?*-")"??*?/35
+2(L-&*).29J"$,(61"O,$O(/#)($/?)1/5(4#J?$%(B(43)#1%51.#4?W73)#%1":(")13/($%L-&*).29W?132$9()17(
$7.()1:(/4"#7(?13")$/O$/$N)""$M0&D@%,1/)/("9("$55.#4$)#1%/W)2("(#/$%179#13/)$/O713%:$"?e$/#%
-
8/13/2019 Java Concurency in Practice
95/234
V\L!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/ CX!>2$5)("QD+$/OPB(43)#1%
R.(//$%%1?#%$%4(..$)#1%#/419("(:#%2$5)("VDc
-
8/13/2019 Java Concurency in Practice
96/234
X] 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4WA@@AD$00$M0&"&0
-
8/13/2019 Java Concurency in Practice
97/234
XCL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/ CX!>2$5)("QD+$/OPB(43)#1%
RJ3")2("5"17.(,6#)2:#9#:#%
-
8/13/2019 Java Concurency in Practice
98/234
XG 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4WA@MAO)&)&4"6
-
8/13/2019 Java Concurency in Practice
99/234
XSL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/ CX!>2$5)("QD+$/OPB(43)#1%
R /(41%:$"? 5"17.(, 62(% 3/#%2$5)("VcW#)4$%7()(",#%$)(:($".?/1$/%1))141%/3,((B4(//#9(
"(/13"4(/D+2#/)(42%#K3(#/3/(:#%=#/)#%?*TFJ)"#*?N*3*)#"./%&3-%)."?
+2()#,(73:
-
8/13/2019 Java Concurency in Practice
100/234
-
8/13/2019 Java Concurency in Practice
101/234
XLL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/C\!>2$5)("VD>$%4(..$)#1%$%:F23):16%
$:">.*)ZA$"&'*??"./%&"&0C:(.0%8&@) #/($/? )1/)$") )$/O/$%: )2"($:/DZ1/)1J )2( )#,(6($..16 )2(, )1:(4#:(62(% )1/)157? .())#%
-
8/13/2019 Java Concurency in Practice
102/234
XQ 0$9$>1%43""(%4?@%-"$4)#4(
R )$/O )2$)6$%)/ )17(4$%4(..$7.(,3/)2$9($4$%4(..$)#1% 51.#4? )2$) /5(4#J#(/ )2(^216^W^62(%^W$%:^62$)^1J
4$%4(..$)#1% 2161)2("41:(4$%"(K3(/)4$%4(..$)#1%W62(%)2()$/O42(4O/62()2("4$%4(..$)#1%2$/7((%"(K3(/)(:W
$%:62$)$4)#1%/)2()$/O)$O(/#%"(/51%/()1$4$%4(..$)#1%"(K3(/)D
>1%/#:(" )2( "($.61".: (B$,5.( 1J /)155#%
-
8/13/2019 Java Concurency in Practice
103/234
XVL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/C\!>2$5)("VD>$%4(..$)#1%$%:F23):16%
4".&99)G.,()21:#%)(""35)/)2()$"./%&K*.:%03/&=89&$;AG)M04* *0$## =89&$; W
G)M04* /24; 4".&99)G.UV W +++ \G)M04* M220&$" 4#I".&99)G.&;UV W +++ \G)M04* #.$.4* M220&$" 4".&99)G.&;UV W +++ \+++
\
@J$)2"($:#/#%)(""35)(:62(%#)#/%1)7.14O(:W#)/#%)(""35)(:/)$)3/#//()W$%:#)#/35)1)2($4)#9#)?7(#%
-
8/13/2019 Java Concurency in Practice
104/234
XX 0$9$>1%43""(%4?@%-"$4)#4(
6#)2#) (#)2(")2"16I".&99)G.&;L-*&G.42"1""(/)1"()2(#%)(""35)(:/)$)3/7?4$..#%1:()2$)
:1(/%`)16%)2()2"($:bJ1"$)2"($:511.W$%?41:(13)/#:(1J)2()2"($:511. #,5.(,(%)$)#1%c/213.:7(4$"(J3.)1
5"(/("9()2( #%)(""35)(:/)$)3//1)2$))2(16%#%
-
8/13/2019 Java Concurency in Practice
105/234
X\L!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/C\!>2$5)("VD>$%4(..$)#1%$%:F23):16%
I".&99)G.&;L-*&G.42" 1" 1)2("6#/( #%:#4$)#%%&0/&4.%,&.*))(>./%&
R/ ,(%)#1%(: #% F(4)#1% LDUW 62(% ?13 4$.. $% #%)(""35)#7.( 7.14O#%
-
8/13/2019 Java Concurency in Practice
106/234
\] 0$9$>1%43""(%4?@%-"$4)#4(
(JJ#4#(%4?$%:"(/51%/#9(%(//D @J?132$9(2#.%&";%))%8*0J:)*"0A!"#$%!"%&'()
G94/$.& #.$.4* %4"$0 '*8&;)0&;L-&*).29'&9/4*& *$"*&0L-&* ] +++[
G)M04* #.$.4* /24; .43&;N)"UN)""$M0& 9e02"6 .43&2).e =43&!"4. )"4.V W
%4"$0 =89&$; .$#C=89&$; ] =89&$;+*)99&".=89&$;UV[*$"*&0L-&*+#*8&;)0&U"&? N)""$M0&UV W
G)M04* /24; 9)"UV W .$#C=89&$;+4".&99)G.UV[ \\e .43&2).e )"4.V[
9+9)"UV[\
M3")2("W#J)2()$/O#/%1)"(/51%/#9()1#%)(""35)#1%W.43&;N)"6#..%1)"()3"%3%)#.)2()$/OJ#%#/2(/W62#42,$?7(.1%
-
8/13/2019 Java Concurency in Practice
107/234
\CL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/C\!>2$5)("VD>$%4(..$)#1%$%:F23):16%
=#/)#%
-
8/13/2019 Java Concurency in Practice
108/234
\G 0$9$>1%43""(%4?@%-"$4)#4(
$%1)2(".1/#%2$5)("CSD
N&$;&9=89&$;#%=#/)#%3(?"./&4P%&3."&0")0$"&'*??"./%&8/.:,&?.$#C%29
+2( )(42%#K3( 3/(: #%N&$;&9=89&$; )1 (%4$5/3.$)( %1%/)$%:$": 4$%4(..$)#1% 4$% 7( "(J#%(: 3/#%3/)1,4$%4(..$)#1%41:(4$%5("J1", .1
-
8/13/2019 Java Concurency in Practice
109/234
\SL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/C\!>2$5)("VD>$%4(..$)#1%$%:F23):16%
N&$;&9=89&$;(%4$5/3.$)(/4$%4(..$)#1%1J/14O()3/#%3(?"./&4P%&3."&0")0$"&'*??"./%&/&"=89&$;Y+E#*))/0/&4I".&99)G.A
G)M04* *0$## N&$;&9=89&$; &-.&";# =89&$; WG94/$.& %4"$0 '2*C&. #2*C&.[G94/$.& %4"$0 I"G).'.9&$3 4"[
G)M04* N&$;&9=89&$;U'2*C&. #2*C&.V .892?# IJL-*&G.42" W.84#+#2*C&. ] #2*C&.[.84#+4" ] #2*C&.+6&.I"G).'.9&$3UV[
\
G)M04* /24; 4".&99)G.UV W.97 W
#2*C&.+*02#&UV[\*$.*8 UIJL-*&G.42" 46"29&;V W \%4"$007 W
#)G&9+4".&99)G.UV[\
\
G)M04* /24; 9)"UV W.97 W
M7.&fg M)% ] "&? M7.&fK!
-
8/13/2019 Java Concurency in Practice
110/234
\U 0$9$>1%43""(%4?@%-"$4)#4(
ZADA@A=1"5>?*TF2%44/&4C*)#/'*
Z1/) /("9("$55.#4$)#1%/ 3/( .1
-
8/13/2019 Java Concurency in Practice
111/234
\LL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/C\!>2$5)("VD>$%4(..$)#1%$%:F23):16%
2/3./&4ZA@LA-)%0('*)$%&3(5*)2%44/&4C*)#/'*8/.:P%C:(.0%8&C(>>%).A
G)M04* *0$## 526P94.&9 WG94/$.& %4"$0 K02*C4"6O)&)&R'.94"6T ()&)&[G94/$.& %4"$0 5266&9=89&$; 0266&9[
G)M04* 526P94.&9UP94.&9 ?94.&9V W
.84#+()&)& ] "&? 54"C&;K02*C4"6O)&)&R'.94"6TUD1@1DI=rV[.84#+0266&9 ] "&? 5266&9=89&$;U?94.&9V[\
G)M04* /24; #.$9.UV W 0266&9+#.$9.UV[ \
G)M04* /24; 026U'.94"6 3#6V .892?# I".&99)G.&;L-*&G.42" W()&)&+G).U3#6V[
\
G94/$.& *0$## 5266&9=89&$; &-.&";# =89&$; WG94/$.& %4"$0 @94".P94.&9 ?94.&9[+++G)M04* /24; 9)"UV W
.97 W?840& U.9)&V
?94.&9+G94".0"U()&)&+.$C&UVV[
\ *$.*8UI".&99)G.&;L-*&G.42" 46"29&;V W\ %4"$007 W
?94.&9+*02#&UV[\
\\
\
M1"$/("9#4( .#O(526P94.&9)17(3/(J3. #%5"1:34)#1%W6(%((:$6$?)1)(",#%$)()2( .1>%)..%.:*2%44/&4C*)#/'*A
G)M04* /24; 026U'.94"6 3#6V .892?# I".&99)G.&;L-*&G.42" W4% UY#8).;2?"N&().&;V
()&)&+G).U3#6V[&0#&
.892? "&? I00&6$0'.$.&L-*&G.42"Ud0266&9 4# #8). ;2?"dV[\
+2(6$?
)1
5"19#:(
"(.#$7.(
/23):16%
J1"
526P94.&9#/
)1
J#B
)2(
"$4(
41%:#)#1%W
62#42
,($%/
,$O#%1%43""(%4?@%-"$4)#4(
ZADADAL-&*).29'&9/4*&C:(.0%8&
@%F(4)#1%QDGDUW6(/$6)2$)L-&*).29'&9/4*&1JJ("/)616$?/)1/23):16%e
-
8/13/2019 Java Concurency in Practice
113/234
-
8/13/2019 Java Concurency in Practice
114/234
\X 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4ZA@\A-)%0('*)J:)*"06%)I";&-4"6'&9/4*&AG)M04* *0$## D9$?0&9=89&$; &-.&";# =89&$; W
G)M04* /24; 9)"UV W.97 W
*9$?0U922.V[\ *$.*8 UI".&99)G.&;L-*&G.42" &V W Xc %$00 .892)68 cX \%4"$007 W
?840& U.9)&V W.97 W
()&)&+G).U@JI'J,V[
M9&$C[\ *$.*8 UI".&99)G.&;L-*&G.42" &^V W Xc 9&.97 cX \\
\\
G94/$.& /24; *9$?0U
-
8/13/2019 Java Concurency in Practice
115/234
\\L!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/C\!>2$5)("VD>$%4(..$)#1%$%:F23):16%
)(42%#K3()161"OW)2()$/O/,3/)5"(/("9()2()2"($:`/#%)(""35)(:/)$)3/62(%)2(?"()3"%W62#426(..7(2$9(:)$/O/
6#..:1$%?6$?D
2/3./&4ZAD@AL-&*).29'&9/4*&.:".c**>3J)"'
-
8/13/2019 Java Concurency in Practice
116/234
]] 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4ZADDA93/&4=N$*C4"6L-&*).29'&9/4*&.%C"#*9&6/&/3:*0J"3
-
8/13/2019 Java Concurency in Practice
117/234
C]CL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/C\!>2$5)("VD>$%4(..$)#1%$%:F23):16%
)2"($:(B#)/$7%1",$..?)2(J"$,(61"O #/#%J1",(:1J)2#/$%:4$%)$O(41""(4)#9($4)#1%D+2#/ #/1%(1J)2(J(6)#,(/
62(%?13,#./%&7"&0?*)3
+2( 5"(9#13/ /(4)#1% 1JJ("(: $ 5"1$4)#9( $55"1$42 )1 )2( 5"17.(, 1J 3%42(4O(: (B4(5)#1%/D +2( +2"($: R-@ $./1
5"19#:(/ )2( !"*$)68.L-*&G.42"E$";0&9 J$4#.#)?W 62#42 .()/ ?13 :()(4) 62(% $ )2"($: :#(/ :3( )1 $% 3%4$3
-
8/13/2019 Java Concurency in Practice
118/234
-
8/13/2019 Java Concurency in Practice
119/234
-
8/13/2019 Java Concurency in Practice
120/234
]U 0$9$>1%43""(%4?@%-"$4)#4(
$:">.*)\AF>>?+/&4J:)*"0-%%?3>2$5)(" Q #%)"1:34(: )2( )$/O (B(43)#1% J"$,(61"OW 62#42 /#,5.#J#(/ ,$%$2$5)("V419("(:/1,(1J
)2( ,(//? :()$#./ 1J /("9#4( .#J(4?4.( )2$) $"#/( J"1, 3/#%
-
8/13/2019 Java Concurency in Practice
121/234
C]LL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/G]!>2$5)("XDR55.?#%
-
8/13/2019 Java Concurency in Practice
122/234
]Q 0$9$>1%43""(%4?@%-"$4)#4(
,1/).?41,53)$)#1%W @lHW1"/1,(41,7#%$)#1%k81)2(?"(K3#"($/4$"4("(/13"4(W/342$/$08!>41%%(4)#1%k@J?13
2$9(:#JJ("(%)4$)(-N/3/#%
-
8/13/2019 Java Concurency in Practice
123/234
C]VL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/G]!>2$5)("XDR55.?#%
-
8/13/2019 Java Concurency in Practice
124/234
]X 0$9$>1%43""(%4?@%-"$4)#4(
M1" 9("? .$"-.$?("W$%:(9(%)3$..?)1)2(4.#(%) (%$7.#%
-
8/13/2019 Java Concurency in Practice
125/234
C]\L!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/G]!>2$5)("XDR55.?#%
-
8/13/2019 Java Concurency in Practice
126/234
-
8/13/2019 Java Concurency in Practice
127/234
CCCL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/G]!>2$5)("XDR55.?#%
-
8/13/2019 Java Concurency in Practice
128/234
CG 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4\A^AJ:)*"0-%%?=1.*&0*08/.:2%44/&4"&0J/5/&4AG)M04* *0$## =434"6=89&$;@220 &-.&";# =89&$;@220L-&*).29 W
G94/$.& %4"$0 =89&$;52*$0R52"6T #.$9.=43&] "&? =89&$;52*$0R52"6TUV[
G94/$.& %4"$0 5266&9 026 ] 5266&9+6&.5266&9Ud=434"6=89&$;@220dV[G94/$.& %4"$0 1.234*52"6 ")3=$#C# ] "&? 1.234*52"6UV[G94/$.& %4"$0 1.234*52"6 .2.$0=43& ] "&? 1.234*52"6UV[
G92.&*.&; /24; M&%29&L-&*).&U=89&$; .e N)""$M0& 9V W#)G&9+M&%29&L-&*).&U.e 9V[
026+%4"&U'.94"6+%293$.Ud=89&$; x#h #.$9. x#de .e 9VV[#.$9.=43&+#&.U'7#.&3+"$"2=43&UVV[\
G92.&*.&; /24; $%.&9L-&*).&UN)""$M0& 9e =892?$M0& .V W.97 W
02"6 &";=43& ] '7#.&3+"$"2=43&UV[02"6 .$#C=43& ] &";=43& a #.$9.=43&+6&.UV[")3=$#C#+4"*9&3&".1";H&.UV[.2.$0=43&+$;;1";H&.U.$#C=43&V[026+%4"&U'.94"6+%293$.Ud=89&$; x#h &"; x#e .43&]x;"#de
.e 9e .$#C=43&VV[\ %4"$007 W
#)G&9+$%.&9L-&*).&U9e .V[\
\
G92.&*.&; /24; .&934"$.&;UV W.97 W
026+4"%2U'.94"6+%293$.Ud=&934"$.&;h $/6 .43&]x;"#de.2.$0=43&+6&.UV X ")3=$#C#+6&.UVVV[
\ %4"$007 W#)G&9+.&934"$.&;UV[
\\
\
\AVA-")"??*?/O/&4N*'()3/#*F?4%)/.:53
+2(5$
-
8/13/2019 Java Concurency in Practice
129/234
CCSL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/G]!>2$5)("XDR55.?#%$..("/1J
G$9$00&0N&*)9#4/&4$%6$#) J1"$.. )2( "(/3.)/7?4"($)#%
-
8/13/2019 Java Concurency in Practice
130/234
CU 0$9$>1%43""(%4?@%-"$4)#4(
7(4$3/( )$/O/ /2$"( /1,(,3)$7.( /)$)(W/342$/ )2( /()1J /((%51/#)#1%/Dc @J,3.)#5.(5"14(//1"/$"($9$#.$7.(W )2#/
413.:"(:34()2()#,(#))$O(/)1J#%:$/1.3)#1%D
D2"*)99&".@)::0&'20/&9#%=#/)#%
-
8/13/2019 Java Concurency in Practice
131/234
CCLL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/G]!>2$5)("XDR55.?#%
-
8/13/2019 Java Concurency in Practice
132/234
CQ 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4\A@ZAN*3(?.Y*")/&42".':93*0Y+D2"*)99&".@)::0&'20/&9Ab=89&$;'$%&G)M04* *0$## B$0)&5$.*8R=T W
bH)$9;&;K7Ud.84#dV G94/$.& = /$0)& ] ")00[G94/$.& %4"$0 D2)".A2?"5$.*8 ;2"& ] "&? D2)".A2?"5$.*8U^V[
G)M04* M220&$" 4#'&.UV W9&.)9" U;2"&+6&.D2)".UV ]] ZV[
\G)M04* #7"*892"4:&; /24; #&.B$0)&U= "&?B$0)&V W
4% UY4#'&.UVV W/$0)& ] "&?B$0)&[;2"&+*2)".A2?"UV[
\\
G)M04* = 6&.B$0)&UV .892?# I".&99)G.&;L-*&G.42" W;2"&+$?$4.UV[#7"*892"4:&; U.84#V W
9&.)9" /$0)&[\
\\
D2"*)99&".@)::0&'20/&9 :1(/ %1) :($. 6(.. 6#)2 )2( 4$/( 62("( )2("( #/ %1 /1.3)#1%e #J $.. 51//#7.( ,19(/ $%:
51/#)#1%/2$9(
7((%
(9$.3$)(:
$%:
%1
/1.3)#1%
2$/
7((%
J13%:W
#20/&6$#)/
J1"(9("
#%
)2(
4$..
)1
6&.'20).42"D+2(
/(K3(%)#$.9("/#1%)(",#%$)(:62(% #)2$:(B2$3/)(:)2(/($"42/5$4(W73)
-
8/13/2019 Java Concurency in Practice
133/234
CCVL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/GC!>2$5)("\D&N@R55.#4$)#1%/
$:">.*)^AR9,F>>?/'"./%&3@J ?13`9( )"#(: )1 6"#)( (9(% $ /#,5.( &N@ $55.#4$)#1% 3/#%EIIJ>DI
@7(.#(9(?134$%5"1
-
8/13/2019 Java Concurency in Practice
134/234
CX 0$9$>1%43""(%4?@%-"$4)#4(
F#%
-
8/13/2019 Java Concurency in Practice
135/234
CC\L!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/GC!>2$5)("\D&N@R55.#4$)#1%/
^ADAC:%).)(&&/&4R9,J"3
-
8/13/2019 Java Concurency in Practice
136/234
G] 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4^A@A,5>?*5*&./&4670)89.0:0.0-#93/&4"&;
-
8/13/2019 Java Concurency in Practice
137/234
CGCL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/GC!>2$5)("\D&N@R55.#4$)#1%/
S/4()*^ADA$%&.)%?S?%88/.:C*>")".*K%0*?"&0H/*8EY]*'.3A
^ALA2%&4)(&&/&4R9,J"3
-
8/13/2019 Java Concurency in Practice
138/234
GG 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4^AVA2%&4)(&&/&4J"3
-
8/13/2019 Java Concurency in Practice
139/234
CGSL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/GC!>2$5)("\D&N@R55.#4$)#1%/
2$9#%
-
8/13/2019 Java Concurency in Practice
140/234
GU 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4^AZA;"'>%)./&4$"&'*??"./%&X$%5>?*./%&P%./6/'"./%&X"&0-)%4)*33P%./6/'"./%&A$M#.9$*. *0$## K$*C692)";=$#CRBT 43G0&3&".# N)""$M0&e
-
8/13/2019 Java Concurency in Practice
141/234
CGLL!-$")@@eF)"34)3"#%1%43""(%)R55.#4$)#1%/GC!>2$5)("\D&N@R55.#4$)#1%/
41,5.()(/W ?13 2$9( )1 ?/.["."K%0*?3
M"1, )2( 5("/5(4)#9( 1J )2( &N@W )2( F6#%
-
8/13/2019 Java Concurency in Practice
142/234
GQ 0$9$>1%43""(%4?@%-"$4)#4(
C(55")+
&N@J"$,(61"O/$"(%($".?$.6$?/ #,5.(,(%)(:$//#%
-
8/13/2019 Java Concurency in Practice
143/234
-
8/13/2019 Java Concurency in Practice
144/234
GX 0$9$>1%43""(%4?@%-"$4)#4(
$:">.*)@_AF#%/0/&42/#*&*337"O")03+2("(#/1J)(%$)(%/#1%7()6((%/$J()?$%:.#9(%(//DE(3/(.14O#%
-
8/13/2019 Java Concurency in Practice
145/234
CG\Q!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("C]DR91#:#%
-
8/13/2019 Java Concurency in Practice
146/234
S] 0$9$>1%43""(%4?@%-"$4)#4(
1h .9$"#%&9F2"&7U371**2)".e 72)91**2)".e ^ZV[Kh .9$"#%&9F2"&7U72)91**2)".e 371**2)".e jZV[
E#)23%.34O?)#,#%
-
8/13/2019 Java Concurency in Practice
147/234
CSCQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("C]DR91#:#%
-
8/13/2019 Java Concurency in Practice
148/234
SG 0$9$>1%43""(%4?@%-"$4)#4(
fSg+2(%((:)1"(.?1%15(%4$../$%:4$"(J3. .14O1":("#%
-
8/13/2019 Java Concurency in Practice
149/234
CSSQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("C]DR91#:#%
-
8/13/2019 Java Concurency in Practice
150/234
SU 0$9$>1%43""(%4?@%-"$4)#4(
@%5"1
-
8/13/2019 Java Concurency in Practice
151/234
-
8/13/2019 Java Concurency in Practice
152/234
SQ 0$9$>1%43""(%4?@%-"$4)#4(
R91#: )2( )(,5)$)#1% )1 3/( )2"($: 5"#1"#)#(/W /#%4( )2(? #%4"($/( 5.$)J1", :(5(%:(%4( $%: 4$% 4$3/( .#9(%(//
5"17.(,/DZ1/)41%43""(%)$55.#4$)#1%/4$%3/()2(:(J$3.)5"#1"#)?J1"$..)2"($:/D
@_ALADA-%%)N*3>%&3/#*&*33
H%( /)(5 "(,19(: J"1, /)$"9$)#1% #/ 511" "(/51%/#9(%(//W 62#42 #/ %1) 3%41,,1% #% &N@ $55.#4$)#1%/ 3/#%-N#%)(%/#9( 7$4O
-
8/13/2019 Java Concurency in Practice
153/234
CSVQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CCD-("J1",$%4($%:F4$.$7#.#)?
$:">.*)@@A-*)6%)5"&'*"&0C'"?"Y/?/.+H%(1J)2(5"#,$"?"($/1%/)13/()2"($:/#/)1#,5"19(5("J1",$%4(D
fCgN/#%
-
8/13/2019 Java Concurency in Practice
154/234
SX 0$9$>1%43""(%4?@%-"$4)#4(
@"1%#4$..?W,$%?1J)2()"#4O/)2$)#,5"19(5("J1",$%4(#%/#%$%?13/3551")?13"$%/6("6#)2,($/3"(,(%)/k
;16 1J)(% $"( )2(/( 41%:#)#1%/ .#O(.? )1 $"#/( #% ?13" /#)3$)#1%k >$% ?13 /3551") ?13" $%/6(" 6#)2,($/3"(,(%)/k
@/)2#/41:(.#O(.?)17(3/(:#%1)2("/#)3$)#1%/62("()2(41%:#)#1%/,$?7(:#JJ("(%)k E2$) 2#::(% 41/)/W /342 $/ #%4"($/(: :(9(.15,(%) 1" ,$#%)(%$%4( "#/OW $"( ?13 )"$:#%
-
8/13/2019 Java Concurency in Practice
155/234
CS\Q!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CCD-("J1",$%4($%:F4$.$7#.#)?
,1/) :#JJ#43.) )1 )"$4O :16% $%: (.#,#%$)(W 216(9("W $%?)2#%
-
8/13/2019 Java Concurency in Practice
156/234
U] 0$9$>1%43""(%4?@%-"$4)#4(
S/4()*@@A@AK"1/5(59./?/O"./%&9&0*)F50":?b32"86%)H")/%(3C*)/"?/O"./%&-*)'*&."4*3A
>2$5)("Q(B5.1"(:#:(%)#J?#%
-
8/13/2019 Java Concurency in Practice
157/234
CUCQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CCD-("J1",$%4($%:F4$.$7#.#)?
2/3./&4@@A@AC*)/"?/O*0F''*33.%"J"3?*TC*)/"?/O"./%&7/00*&/&S)"5*8%)")/&4a(*(*,5>?*5*&."./%&3A
fY#(6J3../#*(#,$
-
8/13/2019 Java Concurency in Practice
158/234
UG 0$9$>1%43""(%4?@%-"$4)#4(
3/(/$)1,#4 "(J("(%4(/ )135:$)( #%:#9#:3$. .#%O51#%)("/D @%1%(W )2((%)#"( #%/(")#1%1" "(,19$. #/ /("#$.#*(:d #% )2(
1)2("W1%.?35:$)(/)1#%:#9#:3$.51#%)("/$"(/("#$.#*(:D
@@ADADAF>>?+/&4F50":?b32"8a("?/."./#*?+
R,:$2.`/ .$6 K3$%)#J#(/ )2( 51//#7.( /5((:35 62(% ,1"( 41,53)#%
-
8/13/2019 Java Concurency in Practice
159/234
-
8/13/2019 Java Concurency in Practice
160/234
-
8/13/2019 Java Concurency in Practice
161/234
CULQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CCD-("J1",$%4($%:F4$.$7#.#)?
2/3./&4@@AMA7%?0/&4"2%'
-
8/13/2019 Java Concurency in Practice
162/234
UQ 0$9$>1%43""(%4?@%-"$4)#4(
/(5$"$)( .14O/ )1
-
8/13/2019 Java Concurency in Practice
163/234
CUVQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CCD-("J1",$%4($%:F4$.$7#.#)?
:"$,$)#4$..? #,5"19(5"1/5(4)/ J1"41%43""(%4?1%$/?/)(,6#)2,$%?5"14(//1"/D+2( .14O/5.#))#%
-
8/13/2019 Java Concurency in Practice
164/234
UX 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4@@A\A7"3:Y"3*0K">93/&42%'/&4Ab=89&$;'$%&G)M04* *0$## '.94G&;F$G W
XX '7"*892"4:$.42" G204*7h M)*C&.#f"g 6)$9;&; M7 02*C#f"x,k5JDl'gG94/$.& #.$.4* %4"$0 4". ,k5JDl' ] ^z[G94/$.& %4"$0 ,2;&fg M)*C&.#[G94/$.& %4"$0 JM`&*.fg 02*C#[
G94/$.& #.$.4* *0$## ,2;& W +++ \
G)M04* '.94G&;F$GU4". ")3K)*C&.#V WM)*C&.# ] "&? ,2;&f")3K)*C&.#g[02*C# ] "&? JM`&*.f,k5JDl'g[%29 U4". 4 ] Z[ 4 R ,k5JDl'[ 4__V
02*C#f4g ] "&? JM`&*.UV[\
G94/$.& %4"$0 4". 8$#8UJM`&*. C&7V W9&.)9" F$.8+$M#UC&7+8$#8D2;&UV x M)*C&.#+0&"6.8V[
\
G)M04* JM`&*. 6&.UJM`&*. C&7V W4". 8$#8 ] 8$#8UC&7V[#7"*892"4:&; U02*C#f8$#8 x ,k5JDl'gV W
%29 U,2;& 3 ] M)*C&.#f8$#8g[ 3 Y] ")00[ 3 ] 3+"&-.V4% U3+C&7+&()$0#UC&7VV
9&.)9" 3+/$0)&[\9&.)9" ")00[
\
G)M04* /24; *0&$9UV W%29 U4". 4 ] Z[ 4 R M)*C&.#+0&"6.8[ 4__V W
#7"*892"4:&; U02*C#f4 x ,k5JDl'gV WM)*C&.#f4g ] ")00[
\\
\+++
\
=14O
-
8/13/2019 Java Concurency in Practice
165/234
CU\Q!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CCD-("J1",$%4($%:F4$.$7#.#)?
(B4.3/#9(.?DM1""($:,1/).?:$)$/)"34)3"(/WN&$;P94.&52*C4$%1JJ("2$5)("GDc+2($)1,#49$"#$7.(4.$//(/5"19#:(9("?J#%(-N3)#.#*$)#1%#/2#
-
8/13/2019 Java Concurency in Practice
166/234
-
8/13/2019 Java Concurency in Practice
167/234
CLCQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CCD-("J1",$%4($%:F4$.$7#.#)?
+2( %3,7("/ J1" )2( /?%42"1%#*(: 41..(4)#1%/ $"( %1) $/ (%413"$
-
8/13/2019 Java Concurency in Practice
168/234
LG 0$9$>1%43""(%4?@%-"$4)#4(
:(.#9("(: )1 )2( J#"(cW5.3/
-
8/13/2019 Java Concurency in Practice
169/234
CLSQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CGD+(/)#%1%43""(%)-"1.*)@DAJ*3./&4$%&'())*&.-)%4)"53>1%43""(%) 5"1-N/c$"(,$:($9$#.$7.(D
@DA@AJ*3./&46%)$%))*'.&*33
8(9(.15#%
-
8/13/2019 Java Concurency in Practice
170/234
LU 0$9$>1%43""(%4?@%-"$4)#4(
fGg @%$413%)#%
-
8/13/2019 Java Concurency in Practice
171/234
CLLQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CGD+(/)#%1%43""(%)-"1
-
8/13/2019 Java Concurency in Practice
172/234
LQ 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4@DALAJ*3./&4;?%'
-
8/13/2019 Java Concurency in Practice
173/234
CLVQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CGD+(/)#%1%43""(%)-"1-N/:1(/ %1)%(4(//$"#.?,$O( )(/)/,1"((JJ(4)#9(D+1 ,$B#,#*( )2(42$%4( 1J:()(4)#%-N/W
/1
)2$)
$)
$%?
-
8/13/2019 Java Concurency in Practice
174/234
LX 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4@DAVA-)%0('*)'%&3(5*)J*3.-)%4)"56%)K2)";&;K)%%&9AG)M04* *0$## @).=$C&=. W
G94/$.& #.$.4* %4"$0 L-&*).29'&9/4*& G220] L-&*).29#+"&?D$*8&;=89&$;@220UV[
G94/$.& %4"$0 1.234*I".&6&9 G).')3 ] "&? 1.234*I".&6&9UZV[G94/$.& %4"$0 1.234*I".&6&9 .$C&')3 ] "&? 1.234*I".&6&9UZV[G94/$.& %4"$0 D7*04*K$994&9 M$994&9[G94/$.& %4"$0 K2)";&;K)%%&9RI".&6&9T MM[G94/$.& %4"$0 4". "=94$0#e "@$49#[
G)M04* #.$.4* /24; 3$4"U'.94"6fg $96#V W"&? @).=$C&=.U^Ze ^Ze ^ZZZZZV+..UV[ XX #$3G0& G$9$3&.&9#G220+#8).;2?"UV[
\
@).=$C&=.U4". *$G$*4.7e 4". "G$49#e 4". ".94$0#V W.84#+MM ] "&? K2)";&;K)%%&9RI".&6&9TU*$G$*4.7V[.84#+"=94$0# ] ".94$0#[.84#+"@$49# ] "G$49#[.84#+M$994&9 ] "&? D7*04*K$994&9U"G$49#c j _ ^V[
\
/24; ..UV W.97 W
%29 U4". 4 ] Z[ 4 R "@$49#[ 4__V WG220+&-&*).&U"&? @92;)*&9UVV[G220+&-&*).&U"&? D2"#)3&9UVV[
\M$994&9+$?$4.UV[ XX ?$4. %29 $00 .89&$;# .2 M& 9&$;7M$994&9+$?$4.UV[ XX ?$4. %29 $00 .89&$;# .2 %4"4#8$##&9.L()$0#UG).')3+6&.UVe .$C&')3+6&.UVV[
\ *$.*8 UL-*&G.42" &V W.892? "&? N)".43&L-*&G.42"U&V[
\\
*0$## @92;)*&9 43G0&3&".# N)""$M0& W Xc 54#.4"6 ^j+z cX \
*0$## D2"#)3&9 43G0&3&".# N)""$M0& W Xc 54#.4"6 ^j+z cX \\
2/3./&4@DAWA-)%0('*)"&0$%&3(5*)$?"33*393*0/&@).=$C&=.A
Xc 4""&9 *0$## 2% @).=$C&=. U54#.4"6 ^j+pV cX*0$## @92;)*&9 43G0&3&".# N)""$M0& WG)M04* /24; 9)"UV W
.97 W4". #&&; ] U.84#+8$#8D2;&UV { U4".V'7#.&3+"$"2=43&UVV[4". #)3 ] Z[M$994&9+$?$4.UV[%29 U4". 4 ] "=94$0#[ 4 T Z[ aa4V W
MM+G).U#&&;V[#)3 _] #&&;[#&&; ] -29'84%.U#&&;V[
\G).')3+6&.1";1;;U#)3V[M$994&9+$?$4.UV[
\ *$.*8 UL-*&G.42" &V W.892? "&? N)".43&L-*&G.42"U&V[
\\
\
*0$## D2"#)3&9 43G0&3&".# N)""$M0& WG)M04* /24; 9)"UV W
.97 WM$994&9+$?$4.UV[4". #)3 ] Z[%29 U4". 4 ] "=94$0#[ 4 T Z[ aa4V W
#)3 _] MM+.$C&UV[\.$C&')3+6&.1";1;;U#)3V[M$994&9+$?$4.UV[
\ *$.*8 UL-*&G.42" &V W.892? "&? N)".43&L-*&G.42"U&V[
\
\\
-
8/13/2019 Java Concurency in Practice
175/234
CL\Q!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CGD+(/)#%1%43""(%)-"1
-
8/13/2019 Java Concurency in Practice
176/234
Q] 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4@DA\AJ:)*"0S"'.%)+6%)J*3./&4=89&$;@220L-&*).29A*0$## =.4"6=89&$;
-
8/13/2019 Java Concurency in Practice
177/234
CQCQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CGD+(/)#%1%43""(%)-"1
-
8/13/2019 Java Concurency in Practice
178/234
QG 0$9$>1%43""(%4?@%-"$4)#4(
S/4()*@DA@A=43&;@).=$C&=.8/.:H")/%(3;(66*)$">"'/./*3A
@),$?7(/1,(62$)53**.#%
-
8/13/2019 Java Concurency in Practice
179/234
CQSQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CGD+(/)#%1%43""(%)-"1?*F?4%)/.:53
E2#.(K2)";&;K)%%&9 #/$ J$#".?/1.#: #,5.(,(%)$)#1% )2$)5("J1",/ "($/1%$7.?6(..W #) )3"%/13) )17(%1,$)42 J1"
(#)2(" 199$7K02*C4"6O)&)& 1" 54"C&;K02*C4"6O)&)& b62#42 (B5.$#%/ 62? )2#/ 73JJ(" $.")/&4;?%'?*5*&."./%&3A
@DADALAK*"3()/&4N*3>%&3/#*&*33
F1 J$" 6( 2$9( J143/(: 1% ,($/3"#%
-
8/13/2019 Java Concurency in Practice
180/234
QU 0$9$>1%43""(%4?@%-"$4)#4(
;#/)1
-
8/13/2019 Java Concurency in Practice
181/234
CQLQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CGD+(/)#%1%43""(%)-"1
-
8/13/2019 Java Concurency in Practice
182/234
QQ 0$9$>1%43""(%4?@%-"$4)#4(
?13$4)3$..?/)$"))#,#%
-
8/13/2019 Java Concurency in Practice
183/234
CQVQ!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CGD+(/)#%1%43""(%)-"1
-
8/13/2019 Java Concurency in Practice
184/234
QX 0$9$>1%43""(%4?@%-"$4)#4(
,#/)$O(/d )$O#%$..#%
-
8/13/2019 Java Concurency in Practice
185/234
CQ\Q!-$")@@@e=#9(%(//W-("J1",$%4(W$%:+(/)#%2$5)("CGD+(/)#%1%43""(%)-"1
-
8/13/2019 Java Concurency in Practice
186/234
V] 0$9$>1%43""(%4?@%-"$4)#4(
-").,HTF0#"&'*0J%>/'3
=>.?@(,36D PB5.#4#)=14O/
=>.?@(,
38D
!3#.:#%3/)1,
F?%42"1%#*("/
=>.?@(,3BD R)1,#4Y$"#$7.(/$%:I1%7.14O#%1%43""(%4?
1#D)#%E,.?>*
-
8/13/2019 Java Concurency in Practice
187/234
CVCV!-$")@YeR:9$%4(:+15#4/ GL!>2$5)("CSPB5.#4#)=14O/
$:">.*)@L =1>?/'/.2%'1%)"$"?)162$)/1,(2$9(6"#))(%WN&&".9$".52*C#/%1)$"(5.$4(,(%)J1"
#%)"#%/#4.14O#%
-
8/13/2019 Java Concurency in Practice
188/234
VG 0$9$>1%43""(%4?@%-"$4)#4(
@LA@A@A-%??*0"&0J/5*02%'
-
8/13/2019 Java Concurency in Practice
189/234
CVSV!-$")@YeR:9$%4(:+15#4/ GL!>2$5)("CSPB5.#4#)=14O/
2/3./&4@LALAF#%/0/&42%'
-
8/13/2019 Java Concurency in Practice
190/234
VU 0$9$>1%43""(%4?@%-"$4)#4(
@%>2$5)("CCW6(/$6216"(:34#%-NW5"14(//1"413%)W4$42(/#*(W$%:0YZ42$"$4)("#/)#4/W$..1J
62#424$%42$%
-
8/13/2019 Java Concurency in Practice
191/234
CVLV!-$")@YeR:9$%4(:+15#4/ GL!>2$5)("CSPB5.#4#)=14O/
@LALAS"/)&*33
+2(N&&".9$".52*C41%/)"34)1"1JJ("/$421#4(1J)61J$#"%(//15)#1%/e4"($)($%1%J$#".14Ob)2(:(J$3.)c1"$J$#".14OD
+2"($:/ $4K3#"( $ J$#" .14O #% )2( 1":(" #% 62#42 )2(? "(K3(/)(: #)W 62("($/ $ %1%J$#" .14O 5(",#)/ 7$"
-
8/13/2019 Java Concurency in Practice
192/234
VQ 0$9$>1%43""(%4?@%-"$4)#4(
@LAMA$:%%3/&4;*.8**&C+&':)%&/O*0"&0N**&.)"&.2%'
-
8/13/2019 Java Concurency in Practice
193/234
CVVV!-$")@YeR:9$%4(:+15#4/ GL!>2$5)("CSPB5.#4#)=14O/
+2(.14O#%
-
8/13/2019 Java Concurency in Practice
194/234
VX 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4@LAZAB)">>/&4"F$G8/.:"N*"08)/.*2%'
-
8/13/2019 Java Concurency in Practice
195/234
-
8/13/2019 Java Concurency in Practice
196/234
X] 0$9$>1%43""(%4?@%-"$4)#4(
E2#.()2#/$55"1$42#/($/?(%13
-
8/13/2019 Java Concurency in Practice
197/234
-
8/13/2019 Java Concurency in Practice
198/234
XG 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4@MAVA;%(&0*0;(66*)93/&4$)(0*;?%'
-
8/13/2019 Java Concurency in Practice
199/234
CXSV!-$")@YeR:9$%4(:+15#4/GQ!>2$5)("CU!3#.:#%3/)1,F?%42"1%#*("/
:1%`) .()?13:1$%?)2#%
-
8/13/2019 Java Concurency in Practice
200/234
XU 0$9$>1%43""(%4?@%-"$4)#4(
73JJ(" #/ #%:((:%1%(,5)?W #) "(,19(/ )2( J#"/) (.(,(%)W62#42 #)4$%:17(4$3/( #) /)#..21.:/ )2( .14O
-
8/13/2019 Java Concurency in Practice
201/234
CXLV!-$")@YeR:9$%4(:+15#4/GQ!>2$5)("CU!3#.:#%3/)1,F?%42"1%#*("/
E2(%3/#%
-
8/13/2019 Java Concurency in Practice
202/234
XQ 0$9$>1%43""(%4?@%-"$4)#4(
K2)";&;K)%%&9,(()/)2(1%(#%W1%(13)"(K3#"(,(%)W73):1(/%1),(())2(3%#J1",6$#)("/"(K3#"(,(%)7(4$3/(
6$#)#%?*TFR".*$?"33
+2(/)$")#%
-
8/13/2019 Java Concurency in Practice
203/234
CXVV!-$")@YeR:9$%4(:+15#4/GQ!>2$5)("CU!3#.:#%3/)1,F?%42"1%#*("/
@MADAWAC(Y'?"33C"6*.+,33(*3
N/#%
-
8/13/2019 Java Concurency in Practice
204/234
XX 0$9$>1%43""(%4?@%-"$4)#4(
)1/((#J)2(?,#
-
8/13/2019 Java Concurency in Practice
205/234
CX\V!-$")@YeR:9$%4(:+15#4/GQ!>2$5)("CU!3#.:#%3/)1,F?%42"1%#*("/
>211/( 7()6((% 3/#%
-
8/13/2019 Java Concurency in Practice
206/234
\] 0$9$>1%43""(%4?@%-"$4)#4(
2/3./&4@MA@DA$%(&./&4C*5">:%)*,5>?*5*&.*093/&452*CAXX ,2. 9&$007 82? `$/$+).40+*2"*)99&".+'&3$G829& 4# 43G0&3&".&;b=89&$;'$%&G)M04* *0$## '&3$G829&J"52*C W
G94/$.& %4"$0 52*C 02*C ] "&? N&&".9$".52*CUV[XX DJ,AI=IJ, @NLAID1=Lh G&934.#1/$40$M0& UG&934.# T ZVG94/$.& %4"$0 D2";4.42" G&934.#1/$40$M0& ] 02*C+"&?D2";4.42"UV[bH)$9;&;K7Ud02*CdV G94/$.& 4". G&934.#[
'&3$G829&J"52*CU4". 4"4.4$0@&934.#V W
02*C+02*CUV[.97 WG&934.# ] 4"4.4$0@&934.#[
\ %4"$007 W02*C+)"02*CUV[
\\
XX K5JDl'a!,=I5h G&934.#1/$40$M0&G)M04* /24; $*()49&UV .892?# I".&99)G.&;L-*&G.42" W
02*C+02*CUV[.97 W
?840& UG&934.# R] ZVG&934.#1/$40$M0&+$?$4.UV[
aaG&934.#[\ %4"$007 W
02*C+)"02*CUV[\
\
G)M04* /24; 9&0&$#&UV W02*C+02*CUV[.97 W
__G&934.#[G&934.#1/$40$M0&+#46"$0UV[
\ %4"$007 W02*C+)"02*CUV[
\\
\
R_F2$%:.(/,$%?1J)2(:()$#./1J #,5.(,(%)#%
-
8/13/2019 Java Concurency in Practice
207/234
C\CV!-$")@YeR:9$%4(:+15#4/GQ!>2$5)("CU!3#.:#%3/)1,F?%42"1%#*("/
R4K3#/#)#1%$%:"(.($/(#%R_F)$O()2(J1",//216%#%=#/)#%?*2".':
J"&'82.5$.*8
#%
=#/)#%1%43""(%4?@%-"$4)#4(
2/3./&4@MA@MA;/&")+2".':93/&41M#.9$*.O)&)&;'7"*892"4:&9Ab=89&$;'$%&G)M04* *0$## J"&'82.5$.*8 W
G94/$.& %4"$0 '7"* #7"* ] "&? '7"*UV[
G)M04* /24; #46"$0UV W #7"*+9&0&$#&'8$9&;UZV[ \
G)M04* /24; $?$4.UV .892?# I".&99)G.&;L-*&G.42" W#7"*+$*()49&'8$9&;I".&99)G.4M07UZV[
\
G94/$.& *0$## '7"* &-.&";# 1M#.9$*.O)&)&;'7"*892"4:&9 WG92.&*.&; 4". .971*()49&'8$9&;U4". 46"29&;V W
XX ')**&&; 4% 0$.*8 4# 2G&" U#.$.& ]] ^Ve &0#& %$409&.)9" U6&.'.$.&UV ]] ^V S ^ h a^[
\
G92.&*.&; M220&$" .97N&0&$#&'8$9&;U4". 46"29&;V W#&.'.$.&U^V[ XX 5$.*8 4# "2? 2G&"9&.)9" .9)&[ XX J.8&9 .89&$;# 3$7 "2? M& $M0& .2 $*()49&
\\
\
@% J"&'82.5$.*8W )2( R_F /)$)( 21.:/ )2( .$)42 /)$)( 4.1/(: b*("1c 1" 15(% b1%(cD +2( $?$4. ,()21: 4$../
$*()49&'8$9&;I".&99)G.4M07#%
R_FW
62#42
#%
)3"%
41%/3.)/
)2(
=N71*()49&'8$9&;
,()21:
#%
J"&'82.5$.*8D
+2(
.971*()49&a'8$9&;#,5.(,(%)$)#1%,3/)"()3"%$9$.3(#%:#4$)#%
-
8/13/2019 Java Concurency in Practice
209/234
C\SV!-$")@YeR:9$%4(:+15#4/GQ!>2$5)("CU!3#.:#%3/)1,F?%42"1%#*("/
fCUg!(4$3/()2(5"1)(4)(:/)$)(,$%#53.$)#1%,()21:/2$9()2(,(,1"?/(,$%)#4/1J$91.$)#.("($:1"6"#)($%:N&&".9$".52*C#/4$"(J3.)1"($:)2(2?"&9J#(.:1%.?$J)("4$..#%
-
8/13/2019 Java Concurency in Practice
210/234
\U 0$9$>1%43""(%4?@%-"$4)#4(
@MAWALAS(.()*J"3
-
8/13/2019 Java Concurency in Practice
211/234
C\LV!-$")@YeR:9$%4(:+15#4/GV!>2$5)("CLDR)1,#4Y$"#$7.(/$%:I1%7.14O#%.*)@VAF.%5/'H")/"Y?*3"&0P%&Y?%'
-
8/13/2019 Java Concurency in Practice
212/234
\Q 0$9$>1%43""(%4?@%-"$4)#4(
,$O(5"1
+2($55"1$42)$O(%7?,1/)5"14(//1"$"42#)(4)3"(/W #%4.3:#%RFc #%/)"34)#1%D bH)2(" 5"14(//1"/W /342 $/ -16("->W #,5.(,(%) )2( /$,( J3%4)#1%$.#)? 6#)2 $ 5$#" 1J #%/)"34)#1%/e
.1$:.#%O(:$%:/)1"(41%:#)#1%$.Dc>RF2$/)2"((15("$%:/ $,(,1"?.14$)#1%Y1%62#42)115("$)(W)2((B5(4)(:1.:
9$.3( RW $%: )2( %(6 9$.3( !D>RF $)1,#4$..? 35:$)(/Y )1 )2(%(6 9$.3( !W 73)1%.? #J )2( 9$.3( #% Y ,$)42(/ )2(
(B5(4)(:1.:9$.3(Rd1)2("6#/( #):1(/%1)2#%RF#/%1)7.14O(:W#)4$%:(4#:(62()2("#)6$%)/)1)"?$
-
8/13/2019 Java Concurency in Practice
213/234
C\VV!-$")@YeR:9$%4(:+15#4/GV!>2$5)("CLDR)1,#4Y$"#$7.(/$%:I1%7.14O#%*)"./%&Ab=89&$;'$%&G)M04* *0$## '43)0$.&;D1' W
bH)$9;&;K7Ud.84#dV G94/$.& 4". /$0)&[
G)M04* #7"*892"4:&; 4". 6&.UV W 9&.)9" /$0)&[ \
G)M04* #7"*892"4:&; 4". *23G$9&1";'?$GU4". &-G&*.&;B$0)&e4". "&?B$0)&V W
4". 20;B$0)& ] /$0)&[
4% U20;B$0)& ]] &-G&*.&;B$0)&V/$0)& ] "&?B$0)&[9&.)9" 20;B$0)&[
\
G)M04* #7"*892"4:&; M220&$" *23G$9&1";'&.U4". &-G&*.&;B$0)&e4". "&?B$0)&V W
9&.)9" U&-G&*.&;B$0)&]] *23G$9&1";'?$GU&-G&*.&;B$0)&e "&?B$0)&VV[
\\
+2()?5#4$.5$))("%J1"3/#%RF#/J#"/))1"($:)2(9$.3(RJ"1,YW:("#9()2(%(69$.3(!J"1,RW$%:)2(%3/(>RF)1
$)1,#4$..? 42$%RF
$::"(//(/ )2( 5"17.(, 1J #,5.(,(%)#%
-
8/13/2019 Java Concurency in Practice
214/234
\X 0$9$>1%43""(%4?@%-"$4)#4(
:1(/%`)/$9($%?$4)3$.(B(43)#1%41/)DH%)2(1)2("2$%:W(B(43)#%RFJ"1,6#)2#%)2(5"1RF
)?5#4$..?
)$O(/
1%
)2(
1":("
1J
$2$%:J3. 1J 4.14O 4?4.(/W /#%4( %1 /?%42"1%#*$)#1% $4"1// 5"14(//1"/ #/ %(4(//$"?D R/ 1J )2#/ 6"#)#%RF1%,3.)#5.(>-N/?/)(,/"$%
-
8/13/2019 Java Concurency in Practice
215/234
C\\V!-$")@YeR:9$%4(:+15#4/GV!>2$5)("CLDR)1,#4Y$"#$7.(/$%:I1%7.14O#%
-
8/13/2019 Java Concurency in Practice
216/234
]] 0$9$>1%43""(%4?@%-"$4)#4(
S/4()*@VA@A52*C"&01.234*I".&6&9-*)6%)5"&'*9&0*)7/4:$%&.*&./%&A
S/4()*@VADA
52*C
"&0
1.234*I".&6&9
-*)6%)5"&'*
9&0*)
K%0*)".*
$%&.*&./%&A
2/3./&4@VAMAN"&0%5P(5Y*)R*&*)".%)93/&4N&&".9$".52*CAb=89&$;'$%&G)M04* *0$## N&&".9$".52*C@#&);2N$";23 &-.&";# @#&);2N$";23 W
G94/$.& %4"$0 52*C 02*C ] "&? N&&".9$".52*CU%$0#&V[G94/$.& 4". #&&;[
N&&".9$".52*C@#&);2N$";23U4". #&&;V W.84#+#&&; ] #&&;[
\
G)M04* 4". "&-.I".U4". "V W02*C+02*CUV[.97 W
4". # ] #&&;[#&&; ] *$0*)0$.&,&-.U#V[4". 9&3$4";&9 ] # x "[9&.)9" 9&3$4";&9 T Z S 9&3$4";&9 h 9&3$4";&9 _ "[
\ %4"$007 W02*C+)"02*CUV[
\\
\
-
8/13/2019 Java Concurency in Practice
217/234
G]CV!-$")@YeR:9$%4(:+15#4/GV!>2$5)("CLDR)1,#4Y$"#$7.(/$%:I1%7.14O#%
-
8/13/2019 Java Concurency in Practice
218/234
]G 0$9$>1%43""(%4?@%-"$4)#4(
41%/#/)(%4?D @% .#%O(: 41..(4)#1% 4.$//(/ /342 $/ K3(3(/W ?13 4$% /1,()#,(/ RF)1)"?)1 #%/)$.. #)1%)2()151J)2(/)$4OD @J)2(/$,(%1:( #//)#..1%)2()151J)2(/)$4O$/62(%6(
/)$")(:W)2(>RF/344((:/d#J)2()15%1:(2$/42$%RFD
D$#D2)".&9 $%: D2"*)99&".'.$*C #..3/)"$)( 42$"$4)("#/)#4/ 1J $.. %1%7.14O#%
-
8/13/2019 Java Concurency in Practice
219/234
G]SV!-$")@YeR:9$%4(:+15#4/GV!>2$5)("CLDR)1,#4Y$"#$7.(/$%:I1%7.14O#%
-
8/13/2019 Java Concurency in Practice
220/234
]U 0$9$>1%43""(%4?@%-"$4)#4(
!()6((%)2(/()6115("$)#1%/W)2(K3(3(#/#%)2( #%)(",(:#$)(/)$)(W/216%#%M#
-
8/13/2019 Java Concurency in Practice
221/234
G]LV!-$")@YeR:9$%4(:+15#4/GV!>2$5)("CLDR)1,#4Y$"#$7.(/$%:I1%7.14O#%0".*)3/&D2"*)99&".54"C&;O)&)&AG94/$.& *0$## ,2;&RLT W
G94/$.& %4"$0 L 4.&3[G94/$.& /20$.40& ,2;&RLT "&-.[
G)M04* ,2;&UL 4.&3V W
.84#+4.&3 ] 4.&3[\\
G94/$.& #.$.4* 1.234*N&%&9&"*&
-
8/13/2019 Java Concurency in Practice
222/234
]Q 0$9$>1%43""(%4?@%-"$4)#4(
(%13RFjc15("$)#1% )2$)4$%15("$)( 1% $51#%)("#%)(
-
8/13/2019 Java Concurency in Practice
223/234
G]VV!-$")@YeR:9$%4(:+15#4/GX!>2$5)("CQD+2(0$9$Z(,1"?Z1:(.
$:">.*)@WAJ:*!"#"K*5%)+K%0*?+2"13
-
8/13/2019 Java Concurency in Practice
224/234
]X 0$9$>1%43""(%4?@%-"$4)#4(
,1:(./$4"1//$"42#)(4)3"(/W0$9$5"19#:(/#)/16%,(,1"?,1:(.W$%:)2(0YZ:($./6#)2)2(:#JJ("(%4(/7()6((%)2(
0ZZ$%:)2(3%:(".?#%
-
8/13/2019 Java Concurency in Practice
225/234
G]\V!-$")@YeR:9$%4(:+15#4/GX!>2$5)("CQD+2(0$9$Z(,1"?Z1:(.
2/3./&4@WA@A,&3(66/'/*&.?+C+&':)%&/O*0-)%4)"5.:".'"&:"#*C()>)/3/&4N*3(?.3A!"#$%!"%&'()
G)M04* *0$## @2##4M0&N&29;&94"6 W#.$.4* 4". - ] Ze 7 ] Z[#.$.4* 4". $ ] Ze M ] Z[
G)M04* #.$.4* /24; 3$4"U'.94"6fg $96#V
.892?# I".&99)G.&;L-*&G.42" W=89&$; 2"& ] "&? =89&$;U"&? N)""$M0&UV W
G)M04* /24; 9)"UV W$ ] ^[- ] M[
\\V[=89&$; 2.8&9 ] "&? =89&$;U"&? N)""$M0&UV W
G)M04* /24; 9)"UV WM ] ^[7 ] $[
\\V[2"&+#.$9.UV[ 2.8&9+#.$9.UV[2"&+`24"UV[ 2.8&9+`24"UV['7#.&3+2).+G94".0"UdU d_ - _ ded _ 7 _ dVdV[
\\
R:$)$"$4(1443"/62(%$9$"#$7.(#/"($:7?,1"()2$%1%()2"($:W$%:6"#))(%7?$).($/)1%()2"($:W73))2("($:/
$%:6"#)(/$"(%1)1":("(:7?2$55(%/7(J1"(DR41""(4).?/?%42"1%#*(:5"1W)2(%R2$55(%/7(J1"(>DfSg=14O/$%:3%.14O/1%(B5.#4#)52*C17[(4)/2$9()2(/$,(,(,1"?/(,$%)#4/$/#%)"#%/#4.14O/DfUgT($:/$%:6"#)(/1J$)1,#49$"#$7.(/2$9()2(/$,(,(,1"?/(,$%)#4/$/91.$)#.(9$"#$7.(/D
P9(% )213
-
8/13/2019 Java Concurency in Practice
226/234
C] 0$9$>1%43""(%4?@%-"$4)#4(
S/4()*@WADA,??(3.)"./%&%67">>*&3Y*6%)*/&.:*!"#"K*5%)+K%0*?A
@WA@AMA-/44+Y"'
-
8/13/2019 Java Concurency in Practice
227/234
GCCV!-$")@YeR:9$%4(:+15#4/GX!>2$5)("CQD+2(0$9$Z(,1"?Z1:(.
2/3./&4@WADA,&&*)$?"33%6
-
8/13/2019 Java Concurency in Practice
228/234
CG 0$9$>1%43""(%4?@%-"$4)#4(
7(J1"($%1)2(")2"($:.1$:/)2$)/2$"(:"(J("(%4(W)2(%)2(6"#)(1J)2("(J("(%4()1)2(%(617[(4)4$%7("(1":("(:
bJ"1, )2( 5("/5(4)#9(1J )2( )2"($: 41%/3,#%
-
8/13/2019 Java Concurency in Practice
229/234
GCSV!-$")@YeR:9$%4(:+15#4/GX!>2$5)("CQD+2(0$9$Z(,1"?Z1:(.
$))2(.(9(.1J#%:#9#:3$.,(,1"?$44(//(/ #)#/$/1")1J^41%43""(%4?$//(,7.?.$%
-
8/13/2019 Java Concurency in Practice
230/234
CU 0$9$>1%43""(%4?@%-"$4)#4(
,()21: "(K3#"(/ /?%42"1%#*$)#1%D !3) $) )2( )#,(W /?%42"1%#*$)#1% 6$/ /.16 $%:W ,1"( #,51")$%).?W %1) 41,5.()(.?
3%:("/)11:e)2((B4.3/#1%$/5(4)/6("(6(..(%13=53"51")(:)11JJ(")2(7(/)1J71)261".:/ .$*? #%#)#$.#*$)#1%6#)213)5$?#%
-
8/13/2019 Java Concurency in Practice
231/234
-
8/13/2019 Java Concurency in Practice
232/234
-
8/13/2019 Java Concurency in Practice
233/234
GCVV!-$")@YeR:9$%4(:+15#4/ S]!!#7.#1:+a(%R"%1.:W0$,(/&1/.#%?"8?011)78I078=08'N=).'DR::#/1%E(/.(?WG]]CD
01/23$!.142$%:I($.&$J)("DY040>=GG3'?&DR::#/1%E(/.(?WG]]LD
;$%/!1(2,DT'&$?=6$"?&XV)703)G'?&X07.AB76(?"7)G0$)"7: F7>Z>I [P@\>?"6''.)78&"C $('@P$(5-I5^AFN5-L
AB12"&)=1"7>?)76)23'&"C>?"8?011)78I078=08'&W5$Z-"(//WG]]SD
NT=2))5ell:1#D$4,D1"0$$'?7&D
R::#/1%
E(/.(?W
C\\LD
Z$")#% &$":%("DL('C07$0&$)6 6"1R)70$)"7&"CY"(7-"7#0B[&7'# &"3)$0)?'801' [I)C'[D F4#(%)#J#4 R,("#4$%W H4)17("
C\V]D
0$,(/&1/.#%
-
8/13/2019 Java Concurency in Practice
234/234
CX 0$9$>1%43""(%4?@%-"$4)#4(
T$,%#9$/=$::$:D5&2'6$Y)756$)"7DZ$%%#%?"8?011)78I078=08'&W5$Z-"(//WG]]LD
NT=2))5ell:1#D$4,D1"