SlideShare a Scribd company logo
Ñåìàíòèêà final ïîëåé â java 
Âëàäèìèð Ñèòíèêîâ, Âàëåíòèí Êîâàëåíêî 
sitnikov@netcracker.com, @VladimirSitnikv 
NetCracker 
Ñåíòÿáðü 2014
Ââåäåíèå 
Ïðèìåðû 
2 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Çà÷åì final â JMM? 
3 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Áåçîïàñíîñòü String 
String s = ... 
if ( checkAccess (s)) { 
return readFile (s); 
} 
Ïðàâèëüíî ëè ïðîâåðÿþòñÿ ïðàâà íà äîñòóï ê ôàéëó? 
4 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Áåç îïàñíîñòü String â java 1.4 
String s = ... 
if ( checkAccess (s)) { 
return readFile (s); 
} 
Îòâåò çàâèñèò îò âåðñèè, è â java 1.4 âîçìîæíû ïðîáëåìû 
5 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Áåç îïàñíîñòü String â java 1.4 
String s = GLOBAL ; 
if ( checkAccess (s)) { 
return readFile (s); 
} 
HackThread 
GLOBAL = 
"/tmp/ etc / passwd " 
. substring (4); 
Íàïðèìåð: HackThread âûïîëíÿåò .substring(4) è êîâàðíî 
ïåðåäà¼ò åãî â ïîòîê, ÷èòàþùèé ôàéëû 
6 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Áåç îïàñíîñòü String â java 1.4 
String s = GLOBAL ; 
if ( checkAccess (s)) { 
return readFile (s); 
} 
HackThread 
GLOBAL = 
"/tmp/ etc / passwd " 
. substring (4); 
 java 1.4 substring-ñòðîêà ññûëàåòñÿ íà òîò æå ìàññèâ 
ñèìâîëîâ, è âñ¼ îïðåëåäÿåòñÿ ïîëÿìè String#offset è String#size 
7 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Áåç îïàñíîñòü String â java 1.4 
String s = GLOBAL ; 
if ( checkAccess (s)) { 
return readFile (s); 
} 
HackThread 
GLOBAL = 
"/tmp/ etc / passwd " 
. substring (4); 
race 
race 
Ñèíõðîíèçàöèè ìåæäó ïîòîêàìè íåò, ïîýòîìó ÷èòàòåëü ìîæåò 
óâèäåòü íåäîèíèöèàëèçèðîâàííûé îáúåêò-ñòðîêó 
8 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Áåç îïàñíîñòü String â java 1.4 
String s = GLOBAL ; 
if ( checkAccess (s)) { 
return readFile (s); 
} 
HackThread 
GLOBAL = 
"/tmp/ etc / passwd " 
. substring (4); 
race 
race 
checkAccess ìîæåò óâèäåòü "/tmp/etc/passwd", à readFile óæå 
"/etc/passwd" 
9 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Áåç îïàñíîñòü String â java 1.4 
String s = GLOBAL ; 
if ( checkAccess (s)) { 
return readFile (s); 
} 
HackThread 
GLOBAL = 
"/tmp/ etc / passwd " 
. substring (4); 
race 
race 
checkAccess ìîæåò óâèäåòü "/tmp/etc/passwd", à readFile óæå 
"/etc/passwd" 
Äàæå ñèíõðîíèçàöèÿ íà s è volatile íå ñïàñóò! 
10 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Áåçîïàñíîñòü String â java 1.5+ 
String s = GLOBAL ; 
if ( checkAccess (s)) { 
return readFile (s); 
} 
HackThread 
GLOBAL = 
"/tmp/ etc / passwd " 
. substring (4); 
hb 
hb 
 java 1.5+ final çàùèùàåò îò íåäîñîçäàííûõ îáúåêòîâ è 
HackTread 
11 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Çà÷åì íàì JMM? 
12 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Êîä-çàãàäêà 
int x = 1; 
public int neverTryThisAtHome () { 
int i = this .x; // it is 1, isn ’t it? 
this . setX (2); // just updates x to 2 
return this .x - i; // 2 - 1 == ...? 
} 
Êàêèå çíà÷åíèÿ ìîãóò âåðíóòüñÿ? 1? 0? -1? 
13 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Êîä-çàãàäêà 
int x = 1; 
public int neverTryThisAtHome () { 
int i = this .x; // it is 1, isn ’t it? 
this . setX (2); // just updates x to 2 
return this .x - i; // 2 - 1 == ...? 
} 
Äà, òóò âåðí¼òñÿ 1 
14 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Êîä-çàãàäêà 
final int x = 1; 
public int neverTryThisAtHome () { 
int i = this .x; // it is 1, isn ’t it? 
this . setX (2); // just updates x to 2 
return this .x - i; // 2 - 1 == ...? 
} 
À òåïåðü äîáàâèì íîæåê final 
15 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Êîä-çàãàäêà 
final int x = 1; 
public int neverTryThisAtHome () { 
int i = this .x; // it is 1, isn ’t it? 
this . setX (2); // just updates x to 2 
return this .x - i; // 2 - 1 == ...? 
} 
Ñïåöèôèêàöèÿ ðàçðåøàåò âñå âàðèàíòû: 1, 0, è äàæå -1! (ñì. 
ïðèìåð 17.5.3-1) 
16 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Íåìíîãî òåîðèè 
17 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ïðîãðàììíûé ïîðÿäîê (program order) 
I Îòðàæàåò òî, â êàêîì ïîðÿäêå íàïèñàí èñõîäíûé êîä 
18 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ïðîãðàììíûé ïîðÿäîê (program order) 
I Îòðàæàåò òî, â êàêîì ïîðÿäêå íàïèñàí èñõîäíûé êîä 
I Êîìïèëÿòîðó çàïðåùåíî ïåðåóïîðÿäî÷èâàòü, èãíîðèðîâàòü è 
ìåíÿòü îïåðàöèè, åñëè ýòî íàðóøèò program order 
19 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ïðîãðàììíûé ïîðÿäîê (program order) 
I Îòðàæàåò òî, â êàêîì ïîðÿäêå íàïèñàí èñõîäíûé êîä 
I Êîìïèëÿòîðó çàïðåùåíî ïåðåóïîðÿäî÷èâàòü, èãíîðèðîâàòü è 
ìåíÿòü îïåðàöèè, åñëè ýòî íàðóøèò program order 
I Íî ýòî íå çíà÷èò, ÷òî âñ¼ âûïîëíÿåòñÿ èìåííî òàê, êàê â 
èñõîäíîì êîäå 
20 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ïðîãðàììíûé ïîðÿäîê (program order) 
I Îòðàæàåò òî, â êàêîì ïîðÿäêå íàïèñàí èñõîäíûé êîä 
I Êîìïèëÿòîðó çàïðåùåíî ïåðåóïîðÿäî÷èâàòü, èãíîðèðîâàòü è 
ìåíÿòü îïåðàöèè, åñëè ýòî íàðóøèò program order 
I Íî ýòî íå çíà÷èò, ÷òî âñ¼ âûïîëíÿåòñÿ èìåííî òàê, êàê â 
èñõîäíîì êîäå 
I Íàïðèìåð: äëÿ îïåðàöèé íàä ëîêàëüíûìè ïåðåìåííûìè 
program order âîîáùå íå îïðåäåë¼í 
21 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
×àñòè÷íûé ïîðÿäîê (partial order) 
I Â ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî "partial order" 
22 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
×àñòè÷íûé ïîðÿäîê (partial order) 
I Â ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî "partial order" 
I ×àñòè÷íûì ïîðÿäêîì hb 
! ÿâëÿåòñÿ áèíàðíîå îòíîøåíèå, 
êîòîðîå: 
23 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
×àñòè÷íûé ïîðÿäîê (partial order) 
I Â ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî partial order 
I ×àñòè÷íûì ïîðÿäêîì hb 
! ÿâëÿåòñÿ áèíàðíîå îòíîøåíèå, 
êîòîðîå: 
I Ðåôëåêñèâíî: äëÿ ëþáîãî ýëåìåíòà x âûïîëíÿåòñÿ x 
hb 
! x 
24 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
×àñòè÷íûé ïîðÿäîê (partial order) 
I Â ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî partial order 
I ×àñòè÷íûì ïîðÿäêîì hb 
! ÿâëÿåòñÿ áèíàðíîå îòíîøåíèå, 
êîòîðîå: 
I Ðåôëåêñèâíî: äëÿ ëþáîãî ýëåìåíòà x âûïîëíÿåòñÿ x 
hb 
! x 
I Àíòèñèììåòðè÷íî: åñëè x 
hb 
! y è y 
hb 
! x, òî x è y ýòî îäíî è 
òî æå 
25 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
×àñòè÷íûé ïîðÿäîê (partial order) 
I Â ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî partial order 
I ×àñòè÷íûì ïîðÿäêîì hb 
! ÿâëÿåòñÿ áèíàðíîå îòíîøåíèå, 
êîòîðîå: 
I Ðåôëåêñèâíî: äëÿ ëþáîãî ýëåìåíòà x âûïîëíÿåòñÿ x 
hb 
! x 
I Àíòèñèììåòðè÷íî: åñëè x 
hb 
! y è y 
hb 
! x, òî x è y ýòî îäíî è 
òî æå 
I Òðàíçèòèâíî: åñëè x 
hb 
! y è y 
hb 
! z, òî x 
hb 
! z 
26 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Happens-before 
I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå 
âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå 
27 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Happens-before 
I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå 
âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå 
I Happens-before ýòî ÷àñòè÷íûé ïîðÿäîê, êîòîðûé äîëæåí 
ñîáëþäàòüñÿ 
28 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Happens-before 
I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå 
âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå 
I Happens-before ýòî ÷àñòè÷íûé ïîðÿäîê, êîòîðûé äîëæåí 
ñîáëþäàòüñÿ 
I Çàïðåùåíî âèäåòü áóäóùèå çàïèñè (r hb 
! w) 
29 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Happens-before 
I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå 
âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå 
I Happens-before ýòî ÷àñòè÷íûé ïîðÿäîê, êîòîðûé äîëæåí 
ñîáëþäàòüñÿ 
I Çàïðåùåíî âèäåòü áóäóùèå çàïèñè (r hb 
! w) 
I È òå, êîòîðûå áûëè ïåðåò¼ðëèñü â hb ïîðÿäêå: 
w1 hb 
! w2 hb 
! r 
30 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Happens-before 
I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå 
âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå 
I Happens-before ýòî ÷àñòè÷íûé ïîðÿäîê, êîòîðûé äîëæåí 
ñîáëþäàòüñÿ 
I Çàïðåùåíî âèäåòü áóäóùèå çàïèñè (r hb 
! w) 
I È òå, êîòîðûå áûëè ïåðåò¼ðëèñü â hb ïîðÿäêå: 
w1 hb 
! w2 hb 
! r 
I È òå, êîòîðûå çàïðåùåíû ïðîñòî òàê: 17.4.8 executions and 
causality requirements 
31 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ñåìàíòèêà final ïîëåé îäíèì ñëàéäîì 
w hb 
! f hb 
! a mc 
! r2 ) w hb 
! r1 dr 
! r2 
I w è r2 – èíòåðåñóþùèå íàñ íàñ çàïèñü è ÷òåíèå 
32 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ñåìàíòèêà final ïîëåé îäíèì ñëàéäîì 
w hb 
! f hb 
! a mc 
! r2 ) w hb 
! r1 dr 
! r2 
I w è r2 – èíòåðåñóþùèå íàñ íàñ çàïèñü è ÷òåíèå 
I f – çàìîðîçêà final ïîëÿ, êîòîðîå ÷èòàåòñÿ â r1 
33 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ñåìàíòèêà final ïîëåé îäíèì ñëàéäîì 
w hb 
! f hb 
! a mc 
! r2 ) w hb 
! r1 dr 
! r2 
I Åñëè åäèíñòâåííûé ïóòü îò çàïèñè ê ÷òåíèþ èä¼ò ÷åðåç âñå 
ýòè ñòðåëî÷êè, òî ìû íå ìîæåì óâèäåòü áîëåå ðàííèå çàïèñè 
34 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ñåìàíòèêà final ïîëåé îäíèì ñëàéäîì 
w hb 
! f hb 
! a mc 
! r2 ) w hb 
! r1 dr 
! r2 
I Åñëè åäèíñòâåííûé ïóòü îò çàïèñè ê ÷òåíèþ èä¼ò ÷åðåç âñå 
ýòè ñòðåëî÷êè, òî ìû íå ìîæåì óâèäåòü áîëåå ðàííèå çàïèñè 
I Åñëè ïóòåé áîëüøå îäíîãî – êàê ïîâåç¼ò 
35 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Freeze action w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
36 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Freeze action w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Freeze action 
37 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Freeze action w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Freeze action 
Ïîëå 
Freeze 
ñëó÷àåòñÿ â êîíöå êîíñòðóêòîðà è ìîðîçèò final ïîëÿ 
38 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Dereference chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T local = GLOBAL ; r1 
int localX = local .x; r2 
I r2 ÷èòàåò ïîëå îáúåêòà 
39 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Dereference chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T local = GLOBAL ; r1 
int localX = local .x; r2 
I r2 ÷èòàåò ïîëå îáúåêòà 
I Ïîòîê íå ñîçäàâàë îáúåêò 
40 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Dereference chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T local = GLOBAL ; r1 
int localX = local .x; r2 
I r2 ÷èòàåò ïîëå îáúåêòà 
I Ïîòîê íå ñîçäàâàë îáúåêò 
I Çíà÷èò, ãäå-òî ìû äîëæíû áûëè ÷èòàòü àäðåñ ýòîãî îáúåêòà 
41 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Dereference chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T local = GLOBAL ; r1 
int localX = local .x; r2 
dr 
I r2 ÷èòàåò ïîëå îáúåêòà 
I Ïîòîê íå ñîçäàâàë îáúåêò 
I Çíà÷èò, ãäå-òî ìû äîëæíû áûëè ÷èòàòü àäðåñ ýòîãî îáúåêòà 
I Ýòî íàçûâàåòñÿ r1 dr 
! r2 
42 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Dereference chain äâà ïîòîêà w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T localA = new T(); 
GLOBAL = localA ; 
Thread 2 
T localB = GLOBAL ; r1 
if ( localB != null ) { 
int localX = localB .x; r2 
} 
dr 
r1 dr 
! r2 (÷èòàåì ïîëå íåñîçäàííîãî íàìè îáúåêòà) 
43 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Dereference chain äâà ïîòîêà w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T localA = new T(); a 
GLOBAL = localA ; 
Thread 2 
T localB = GLOBAL ; r1 
if ( localB != null ) { 
int localX = localB .x; r2 
} 
dr 
dr? 
Åñòü ëè a dr 
! r2? 
44 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Dereference chain äâà ïîòîêà w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T localA = new T(); a 
GLOBAL = localA ; 
Thread 2 
T localB = GLOBAL ; r1 
if ( localB != null ) { 
int localX = localB .x; r2 
} 
dr 
dr? 
Ìåæäó ïîòîêàìè dr íå âîçíèêàåò! 
45 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Dereference chain: êîíòðîëüíûé âwûñòðåë hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T local = GLOBAL ; ra 
local = GLOBAL ; rb 
int localX = local .x; r2 
Åñòü ëè çäåñü dr ? 
46 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Dereference chain: êîíòðîëüíûé âwûñòðåë hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T local = GLOBAL ; ra 
local = GLOBAL ; rb 
int localX = local .x; r2 
dr? 
dr? 
Îäèí èç ra dr 
! r2 èëè rb dr 
! r2 òî÷íî äîëæåí áûòü, íî òî÷íåå 
ñêàçàòü íåâîçìîæíî 
47 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Memory chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T o = new T (); 
GL = o; w1 
Thread 2 
T o = GL; r1 
GL2 = o; 
Thread 3 
T o = GL2; 
int r = o.x; 
mc 
Åñëè ÷òåíèå âèäèò çàïèñü, òî w1 mc 
! r1 
48 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Memory chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T o = new T (); 
GL = o; w1 
Thread 2 
T o = GL; r1 
GL2 = o; w2 
Thread 3 
T o = GL2; 
int r = o.x; 
mc 
mc 
Åñëè ïèøåì àäðåñ ñîçäàííîãî âðàãîì îáúåêòà, òî r1 mc 
! w2 
49 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Memory chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T o = new T (); 
GL = o; w1 
Thread 2 
T o = GL; r1 
GL2 = o; w2 
Thread 3 
T o = GL2; r3 
int r = o.x; 
mc 
mc 
mc 
r3 âèäèò w2 ) w2 mc 
! r3 
50 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Memory chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T o = new T (); 
GL = o; w1 
Thread 2 
T o = GL; r1 
GL2 = o; w2 
Thread 3 
T o = GL2; r3 
int r = o.x; r4 
mc 
mc 
mc dr 
r3 dr 
! r4 (÷èòàåì ïîëå îáúåêòà) 
51 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Memory chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T o = new T (); 
GL = o; w1 
Thread 2 
T o = GL; r1 
GL2 = o; w2 
Thread 3 
T o = GL2; r3 
int r = o.x; r4 
mc 
mc 
mc dr 
mc 
r3 dr 
! r4 (÷èòàåì ïîëå îáúåêòà) ) r3 mc 
! r4 
52 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Memory chain: ÷òî ýòî? w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T o = new T (); 
GL = o; w1 
Thread 2 
T o = GL; r1 
GL2 = o; w2 
Thread 3 
T o = GL2; r3 
int r = o.x; r4 
mc 
mc 
mc dr 
mc 
mc 
mc òðàíçèòèâíî (ò.ê. ÷àñòè÷íûé ïîðÿäîê) ) w1 mc 
! r4 
53 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ââåäåíèå 
Ïðèìåðû 
54 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Disclaimer 
I Âñå ïðèìåðû îïàñíî ñèíõðîíèçèðîâàíû (èíà÷å çà÷åì ìû 
ñîáðàëèñü?) 
55 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Disclaimer 
I Âñå ïðèìåðû îïàñíî ñèíõðîíèçèðîâàíû (èíà÷å çà÷åì ìû 
ñîáðàëèñü?) 
I Ñëó÷àè ÷òåíèÿ null íå ðàññìàòðèâàåì (äàæå åñëè îíè 
âîçìîæíû) 
56 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Disclaimer 
I Âñå ïðèìåðû îïàñíî ñèíõðîíèçèðîâàíû (èíà÷å çà÷åì ìû 
ñîáðàëèñü?) 
I Ñëó÷àè ÷òåíèÿ null íå ðàññìàòðèâàåì (äàæå åñëè îíè 
âîçìîæíû) 
I Ïðè ñîñòàâëåíèè ñëàéäîâ ïîñòðàäàë íå îäèí ìîçã 
57 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ýòàëîííûé final (1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
}}; 
GLOBAL = l; 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; r2 
} 
Âîçìîæíî ëè â result ïîëó÷èòü 0? 
58 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ýòàëîííûé final (1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
}}; f 
GLOBAL = l; a 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; 
} 
hb 
hb 
Äåéñòâèÿ â îäíîì ïîòîêå îáðàçóþò happens-before: 
w hb 
! f , f hb 
! a 
59 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ýòàëîííûé final (1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
}}; f 
GLOBAL = l; a 
Thread 2 
T o = GLOBAL ; r0 
if (o != null ) { 
int result = o.fx; 
} 
hb 
hb 
mc 
r0 âèäèò çàïèñü a : 
a mc 
! r0 
60 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ýòàëîííûé final (1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
}}; f 
GLOBAL = l; a 
Thread 2 
T o = GLOBAL ; r0 
if (o != null ) { 
int result = o.fx; r1 
} 
hb 
hb 
mc 
dr 
Ïîòîê 2 íå ñîçäàâàë îáúåêò, r1 ÷èòàåò åãî ïîëå, à r ýòî 
åäèíñòâåííîå ÷òåíèå àäðåñà îáúåêòà, ïîýòîìó dereference chain: 
r0 dr 
! r1 
61 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ýòàëîííûé final (1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
}}; f 
GLOBAL = l; a 
Thread 2 
T o = GLOBAL ; r0 
if (o != null ) { 
int result = o.fx; r1 
} 
hb 
hb 
mc 
dr 
mc 
r0 dr 
! r1 ) r0 mc 
! r1 
62 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ýòàëîííûé final (1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
}}; f 
GLOBAL = l; a 
Thread 2 
T o = GLOBAL ; r0 
if (o != null ) { 
int result = o.fx; r1 
} 
hb 
hb 
mc 
mc 
mc 
a mc 
! r1 ( mc òðàíçèòèâíî) 
63 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ýòàëîííûé final (1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
}}; f 
GLOBAL = l; a 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; r1 r2 
} 
hb 
hb 
mc 
dr 
Âîçüì¼ì r2 = r 1, òîãäà r1 dr 
! r2 ( dr ðåôëåêñèâíî) 
64 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ýòàëîííûé final (1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
}}; f 
GLOBAL = l; a 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; r1 r2 
} 
hb 
hb 
mc 
dr 
hb* 
Íàøëè âñ¼ íåîáõîäèìîå äëÿ HB: 
w hb 
! f hb 
! a mc 
! r2 ) w hb 
! r1 dr 
! r2 
65 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ýòàëîííûé final (1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
}}; f 
GLOBAL = l; a 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; r1 r2 
} 
hb 
hb 
mc 
dr 
hb* 
(w hb 
! r2) ) result 2 f42g 
66 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ìàññèâ âíóòðè final (2) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T l = new T() {{ 
int [] u = new int [1]; 
u [0] = 42; w 
fx = u; 
}}; 
GLOBAL = l; 
T o = GLOBAL ; 
if (o != null ) { 
int [] lfx = o.fx; 
int result = lfx [0]; r2 
} 
Âîçìîæíî ëè â result ïîëó÷èòü 0? 
67 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ìàññèâ âíóòðè final (2) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T l = new T() {{ 
int [] u = new int [1]; 
u [0] = 42; w 
fx = u; 
}}; f 
GLOBAL = l; a 
T o = GLOBAL ; 
if (o != null ) { 
int [] lfx = o.fx; 
int result = lfx [0]; r2 
} 
hb 
hb 
Äåéñòâèÿ â îäíîì ïîòîêå îáðàçóþò happens-before: 
w hb 
! f , f hb 
! a 
68 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ìàññèâ âíóòðè final (2) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T l = new T() {{ 
int [] u = new int [1]; 
u [0] = 42; w 
fx = u; 
}}; f 
GLOBAL = l; a 
T o = GLOBAL ; 
if (o != null ) { 
int [] lfx = o.fx; r1 
int result = lfx [0]; r2 
} 
hb 
hb 
mc 
r1 âèäèò çàïèñü a (ò.ê. ïðîñòîå final ïîëå): 
a mc 
! r1 
69 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ìàññèâ âíóòðè final (2) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T l = new T() {{ 
int [] u = new int [1]; 
u [0] = 42; w 
fx = u; 
}}; f 
GLOBAL = l; a 
T o = GLOBAL ; 
if (o != null ) { 
int [] lfx = o.fx; r1 
int result = lfx [0]; r2 
} 
hb 
hb 
mc 
dr 
Ïîòîê 2 íå ñîçäàâàë ìàññèâ, r2 ÷èòàåò åãî ýëåìåíò, r1 ýòî 
åäèíñòâåííîå ÷òåíèå àäðåñà ìàññèâà, ïîýòîìó dereference chain: 
r1 dr 
! r2 
70 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ìàññèâ âíóòðè final (2) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T l = new T() {{ 
int [] u = new int [1]; 
u [0] = 42; w 
fx = u; 
}}; f 
GLOBAL = l; a 
T o = GLOBAL ; 
if (o != null ) { 
int [] lfx = o.fx; r1 
int result = lfx [0]; r2 
} 
hb 
hb 
mc 
dr 
hb* 
Íàøëè âñ¼ íåîáõîäèìîå äëÿ HB: 
w hb 
! f hb 
! a mc 
! r2 ) w hb 
! r1 dr 
! r2 
71 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ìàññèâ âíóòðè final (2) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T l = new T() {{ 
int [] u = new int [1]; 
u [0] = 42; w 
fx = u; 
}}; f 
GLOBAL = l; a 
T o = GLOBAL ; 
if (o != null ) { 
int [] lfx = o.fx; r1 
int result = lfx [0]; r2 
} 
hb 
hb 
mc 
dr 
hb* 
(w hb 
! r2) ) result 2 f42g 
72 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ìàññèâ íàîáîðîò (2.1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T l = new T() {{ 
int [] u = new int [1]; 
fx = u; // (!) 
u [0] = 42; w 
}}; 
GLOBAL = l; 
T o = GLOBAL ; 
if (o != null ) { 
int [] lfx = o.fx; 
int result = lfx [0]; 
} 
Âîçìîæíî ëè â result ïîëó÷èòü 0? 
73 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ìàññèâ íàîáîðîò (2.1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T l = new T() {{ 
int [] u = new int [1]; 
fx = u; // (!) 
u [0] = 42; w 
}}; f 
GLOBAL = l; a 
T o = GLOBAL ; 
if (o != null ) { 
int [] lfx = o.fx; r1 
int result = lfx [0]; r2 
} 
hb 
hb 
mc 
dr 
hb 
Ñòðîèì hb òàê æå êàê è â ïðåäûäóùåì ñëó÷àå 
74 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Ìàññèâ íàîáîðîò (2.1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T l = new T() {{ 
int [] u = new int [1]; 
fx = u; // (!) 
u [0] = 42; w 
}}; f 
GLOBAL = l; a 
T o = GLOBAL ; 
if (o != null ) { 
int [] lfx = o.fx; r1 
int result = lfx [0]; r2 
} 
hb 
hb 
mc 
dr 
hb 
(w hb 
! r2) ) result 2 f42g 
Ðåçóëüòàò íå çàâèñèò îò ïîðÿäêà çàïèñè final ïîëåé! 
75 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Óòåêàíèå this (3) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLOBAL = this ; 
}}; 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; r2 
} 
Âîçìîæíî ëè â result ïîëó÷èòü 0? 
76 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Óòåêàíèå this (3) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLOBAL = this ; a 
}}; f 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; r2 
} 
hb 
hb 
Äåéñòâèÿ â îäíîì ïîòîêå îáðàçóþò happens-before: 
w hb 
! f , a hb 
! f 
77 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Óòåêàíèå this (3) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLOBAL = this ; a 
}}; f 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; r2 
} 
hb 
hb? 
hb 
Íî íàì-òî íóæíî f hb 
! a! 
78 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Óòåêàíèå this (3) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLOBAL = this ; a 
}}; f 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; r2 
} 
hb 
hb? 
hb 
Åñëè a hb 
! f è f hb 
! a, òî a = f (àíòèñèììåòðè÷íîñòü hb ) 
Íî ïóáëèêàöèÿ ññûëêè ýòî íèêàê íå freeze action! 
79 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Óòåêàíèå this (3) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLOBAL = this ; a 
}}; f 
Thread 2 
T o = GLOBAL ; 
if (o != null ) { 
int result = o.fx; r2 
} 
hb 
hb? 
hb 
Íåò hb , ïîýòîìó âîçìîæíû âñå âàðèàíòû: result 2 f0; 42g 
80 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Âðåäèòåëüñêîå óòåêàíèå this (4) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLb = this ; 
}}; 
GLa = l; 
Thread 2 
T u = GLb; 
T o = GLa; 
if (o != null ) { 
int result = o.fx; r2 
} 
Âîçìîæíî ëè â result ïîëó÷èòü 0? 
81 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Âðåäèòåëüñêîå óòåêàíèå this (4) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLb = this ; b 
}}; f 
GLa = l; a 
Thread 2 
T u = GLb; 
T o = GLa; 
if (o != null ) { 
int result = o.fx; 
} 
hb 
hb 
hb? 
Äåéñòâèÿ â îäíîì ïîòîêå îáðàçóþò happens-before: 
w hb 
! f , f hb 
! a 
82 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Âðåäèòåëüñêîå óòåêàíèå this (4) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLb = this ; b 
}}; f 
GLa = l; a 
Thread 2 
T u = GLb; 
T o = GLa; ra 
if (o != null ) { 
int result = o.fx; 
} 
hb 
hb 
hb? 
mc 
Ïóñòü âòîðîé ïîòîê óâèäåë GLa, òîãäà a mc 
! ra! 
83 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Âðåäèòåëüñêîå óòåêàíèå this (4) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLb = this ; b 
}}; f 
GLa = l; a 
Thread 2 
T u = GLb; rb 
T o = GLa; ra 
if (o != null ) { 
int result = o.fx; r1 
} 
hb 
hb 
hb? 
mc 
dr? 
dr? 
Ãäå-òî äîëæíî áûòü dr : rb dr 
! r1 èëè ra dr 
! r1 
84 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Âðåäèòåëüñêîå óòåêàíèå this (4) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLb = this ; b 
}}; f 
GLa = l; a 
Thread 2 
T u = GLb; rb 
T o = GLa; ra 
if (o != null ) { 
int result = o.fx; r1 
} 
hb 
hb 
hb? 
mc 
dr? 
dr 
! r 1, òî ìû ïîïàëè, ò.ê. w hb 
Åñëè rb dr 
! r1 íå ñòðîèòñÿ 
85 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Âðåäèòåëüñêîå óòåêàíèå this (4) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
T l = new T() {{ 
fx = 42; w 
GLb = this ; b 
}}; f 
GLa = l; a 
Thread 2 
T u = GLb; rb 
T o = GLa; ra 
if (o != null ) { 
int result = o.fx; r1 
} 
hb 
hb 
hb? 
mc 
dr? 
dr 
Âûâîä: åñëè íàø ïîòîê óæå ÷èòàë îáúåêò ñ íåçàìîðîæåííûìè 
ïîëÿìè, òî ãàðàíòèé final semantics íåò! 
86 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Reflection in action (5) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T t = new T() {{ 
fu = new U (); 
fu.x = 1; w1 
}}; 
GLOBAL = t; 
U w = new U (); 
w.x = 42; w2 
reflectSet (t.fu , w); 
Thread 2 
T t = GLOBAL ; 
if (t != null ) { 
U u = t.fu; 
int result = u.x; r2 
} 
Âîçìîæíî ëè â result ïîëó÷èòü 0? 
87 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Reflection in action (5) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T t = new T() {{ 
fu = new U (); 
fu.x = 1; 
}}; 
GLOBAL = t; 
U w = new U (); 
w.x = 42; w2 
reflectSet (t.fu , w); 
Thread 2 
T t = GLOBAL ; 
if (t != null ) { 
U u = t.fu; 
int result = u.x; r2 
} 
hb*? 
Ïî-õîðîøåìó, íàì íóæíî w2 hb 
! r2 (èíà÷å íå çàïðåùåíî âèäåòü 
çàïèñü 0 â w.x) 
88 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Reflection in action (5) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T t = new T() {{ 
fu = new U (); 
fu.x = 1; 
}}; 
GLOBAL = t; 
U w = new U (); 
w.x = 42; w2 
reflectSet (t.fu , w); f2 
Thread 2 
T t = GLOBAL ; 
if (t != null ) { 
U u = t.fu; 
int result = u.x; r2 
} 
hb*? 
f2 íå ïîäõîäèò äëÿ hb : íåò ïîäõîäÿùåãî f 2 hb 
! a 
89 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Reflection in action (5) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T t = new T() {{ 
fu = new U (); 
fu.x = 1; 
}}; f1 
GLOBAL = t; 
U w = new U (); 
w.x = 42; w2 
reflectSet (t.fu , w); f2 
Thread 2 
T t = GLOBAL ; 
if (t != null ) { 
U u = t.fu; 
int result = u.x; r2 
} 
hb*? 
hb? 
f1 òîæå íå ïîäõîäèò äëÿ hb : äîëæíî áûòü w2 hb 
! f 1 
90 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Reflection in action (5) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T t = new T() {{ 
fu = new U (); 
fu.x = 1; 
}}; f1 
GLOBAL = t; 
U w = new U (); 
w.x = 42; w2 
reflectSet (t.fu , w); f2 
Thread 2 
T t = GLOBAL ; 
if (t != null ) { 
U u = t.fu; 
int result = u.x; r2 
} 
hb*? 
hb? 
Ïîëó÷àåòñÿ, ÷òî ÷òåíèþ r2 íå çàïðåùåíî âèäåòü 0 
91 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Reflection in action (5) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T t = new T() {{ 
fu = new U (); 
fu.x = 1; 
}}; f1 
GLOBAL = t; a 
U w = new U(); 
w.x = 42; w2 
reflectSet (t.fu , w); f2 
Thread 2 
T t = GLOBAL ; 
if (t != null ) { 
U u = t.fu; 
int result = u.x; r2 
} 
hb*? 
hb? 
Èòîãî: ïîñëå ïóáëèêàöèè ìåíÿòü final ïîëÿ îïàñíî 
result 2 f0; 1; 42g 
92 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
×èíèì reflection (5.1) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
T t = new T() {{ 
fu = new U (); 
fu.x = 1; 
}}; 
U w = new U (); 
w.x = 42; 
reflectSet (t.fu , w); 
GLOBAL = t; a 
Thread 2 
T t = GLOBAL ; 
if (t != null ) { 
U u = t.fu; 
int result = u.x; 
} 
Åñëè ïóáëèêîâàòü ññûëêó ïîñëå âñåõ èçìåíåíèé final ïîëåé, òî 
âñ¼ ðàáîòàåò: result 2 f1; 42g 
93 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Final wrapper (6) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
A a = new O() {{ 
fx = 42; w 
}}; 
GL = a; 
Thread 2 
A a = GL; 
B = new B() {{ 
fb = o; 
}}; 
GL2 = b; 
Thread 3 
B B = GL2; 
A a = b.fb; 
int r = a.fx; r2 
Âîçìîæíî ëè â result ïîëó÷èòü 0? 
94 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Final wrapper (6) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
A a = new O() {{ 
fx = 42; w 
}}; 
GL = a; wa 
Thread 2 
A a = GL; ra 
B = new B() {{ 
fb = o; wb 
}}; 
GL2 = b; 
Thread 3 
B B = GL2; 
mc 
A a = b.fb; rb 
int r = a.fx; r1 
mc 
rb âèäèò wb ) wb mc 
! rb 
ra âèäèò çàïèñü wa : wa mc 
! ra 
95 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Final wrapper (6) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
A a = new O() {{ 
fx = 42; w 
}}; 
GL = a; wa 
Thread 2 
A a = GL; ra 
B = new B() {{ 
fb = o; wb 
}}; 
GL2 = b; 
Thread 3 
B B = GL2; 
mc 
A a = b.fb; rb 
int r = a.fx; r1 
mc 
mc 
Ïîòîê 2 ïèøåò àäðåñ ñîçäàííîãî âðàãîì îáúåêòà, ïîýòîìó 
ra mc 
! wb 
96 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Final wrapper (6) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
A a = new O() {{ 
fx = 42; w 
}}; 
GL = a; wa 
Thread 2 
A a = GL; ra 
B = new B() {{ 
fb = o; wb 
}}; 
GL2 = b; 
Thread 3 
B B = GL2; 
mc 
A a = b.fb; rb 
int r = a.fx; r1 
mc 
mc 
dr 
Ïîòîê 3 íå ñîçäàâàë îáúåêò A, r ÷èòàåò åãî ïîëå, à rb ýòî 
åäèíñòâåííîå ÷òåíèå àäðåñà îáúåêòà, ïîýòîìó dereference chain: 
rb dr 
! r1 
97 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Final wrapper (6) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
A a = new O() {{ 
fx = 42; w 
}}; 
GL = a; wa 
Thread 2 
A a = GL; ra 
B = new B() {{ 
fb = o; wb 
}}; 
GL2 = b; 
Thread 3 
B B = GL2; 
mc 
A a = b.fb; rb 
int r = a.fx; r1 
mc 
mc 
dr 
mc 
rb dr 
! r1 ) rb mc 
! r1 
98 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Final wrapper (6) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
A a = new O() {{ 
fx = 42; w 
}}; 
GL = a; wa 
Thread 2 
A a = GL; ra 
B = new B() {{ 
fb = o; wb 
}}; 
GL2 = b; 
Thread 3 
B B = GL2; 
mc 
A a = b.fb; rb 
int r = a.fx; r1 
mc 
mc 
mc 
mc 
mc òðàíçèòèâíî (ò.ê. ÷àñòè÷íûé ïîðÿäîê) ) wa mc 
! r1 
99 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Final wrapper (6) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
A a = new O() {{ 
fx = 42; w 
}}; f 
GL = a; wa 
Thread 2 
A a = GL; ra 
B = new B() {{ 
fb = o; wb 
}}; 
GL2 = b; 
Thread 3 
B B = GL2; 
A a = b.fb; rb 
int r = a.fx; r1 r2 
mc 
dr 
Âîçüì¼ì r2 = r 1, òîãäà r1 dr 
! r2 ( dr ðåôëåêñèâíî) 
100 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Final wrapper (6) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
A a = new O() {{ 
fx = 42; w 
}}; f 
GL = a; wa 
Thread 2 
A a = GL; ra 
B = new B() {{ 
fb = o; wb 
}}; 
GL2 = b; 
Thread 3 
B B = GL2; 
A a = b.fb; rb 
int r = a.fx; r1 r2 
mc 
dr 
hb 
hb 
hb* 
Íàøëè âñ¼ íåîáõîäèìîå äëÿ HB: 
w hb 
! f hb 
! a mc 
! r2 ) w hb 
! r1 dr 
! r2 
101 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Final wrapper (6) w hb 
! f hb 
! a mc 
! r1 dr 
! r2 
Thread 1 
A a = new O() {{ 
fx = 42; w 
}}; f 
GL = a; wa 
Thread 2 
A a = GL; ra 
B = new B() {{ 
fb = o; wb 
}}; 
GL2 = b; 
Thread 3 
B B = GL2; 
A a = b.fb; rb 
int r = a.fx; r1 r2 
mc 
dr 
hb 
hb 
hb* 
(w hb 
! r2) ) result 2 f42g 
102 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
Âîïðîñû? 
103 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved

More Related Content

Similar to Семантика final полей в java

Computer System Oranization-R.D.Sivakumar
Computer System Oranization-R.D.SivakumarComputer System Oranization-R.D.Sivakumar
Computer System Oranization-R.D.Sivakumar
Sivakumar R D .
 
Triển khai Modsecurity vào hệ thống NMS - Quan Minh Tâm
Triển khai Modsecurity vào hệ thống NMS - Quan Minh TâmTriển khai Modsecurity vào hệ thống NMS - Quan Minh Tâm
Triển khai Modsecurity vào hệ thống NMS - Quan Minh Tâm
Security Bootcamp
 
Zvika markfeld
Zvika markfeldZvika markfeld
Zvika markfeld
Rika Shoham
 
RoSE Framework
RoSE FrameworkRoSE Framework
RoSE Framework
Alpen-Adria-Universität
 
Boetticher Presentation Promise 2008v2
Boetticher Presentation Promise 2008v2Boetticher Presentation Promise 2008v2
Boetticher Presentation Promise 2008v2
gregoryg
 
Cisco Connect Toronto 2018 sixty to zero
Cisco Connect Toronto 2018   sixty to zeroCisco Connect Toronto 2018   sixty to zero
Cisco Connect Toronto 2018 sixty to zero
Cisco Canada
 
DEF CON 27 - MICHAEL LEIBOWITZ and TOPHER TIMZEN - edr is coming hide yo sht
DEF CON 27 - MICHAEL LEIBOWITZ and TOPHER TIMZEN - edr is coming hide yo shtDEF CON 27 - MICHAEL LEIBOWITZ and TOPHER TIMZEN - edr is coming hide yo sht
DEF CON 27 - MICHAEL LEIBOWITZ and TOPHER TIMZEN - edr is coming hide yo sht
Felipe Prado
 
Cisco Connect Ottawa 2018 sixty to zero
Cisco Connect Ottawa 2018 sixty to zeroCisco Connect Ottawa 2018 sixty to zero
Cisco Connect Ottawa 2018 sixty to zero
Cisco Canada
 
Building Pageless Apps with Rails and Backbone.js
Building Pageless Apps with Rails and Backbone.jsBuilding Pageless Apps with Rails and Backbone.js
Building Pageless Apps with Rails and Backbone.js
ZURB
 
Latin America Tour 2019 - slow data and sql processing
Latin America Tour 2019  - slow data and sql processingLatin America Tour 2019  - slow data and sql processing
Latin America Tour 2019 - slow data and sql processing
Connor McDonald
 
톰캣 #05-배치
톰캣 #05-배치톰캣 #05-배치
톰캣 #05-배치
GyuSeok Lee
 
Critical software developement
Critical software developementCritical software developement
Critical software developement
nedseb
 
BSides IR in Heterogeneous Environment
BSides IR in Heterogeneous EnvironmentBSides IR in Heterogeneous Environment
BSides IR in Heterogeneous Environment
Stefano Maccaglia
 
Learning to Rank Relevant Malware Strings Using Weak Supervision
Learning to Rank Relevant Malware Strings Using Weak SupervisionLearning to Rank Relevant Malware Strings Using Weak Supervision
Learning to Rank Relevant Malware Strings Using Weak Supervision
Phil Tully
 
"Quantum" Performance Effects
"Quantum" Performance Effects"Quantum" Performance Effects
"Quantum" Performance Effects
Sergey Kuksenko
 
Super1
Super1Super1
Codeception Testing Framework -- English #phpkansai
Codeception Testing Framework -- English #phpkansaiCodeception Testing Framework -- English #phpkansai
Codeception Testing Framework -- English #phpkansai
Florent Batard
 
The Death of a Mouse
The Death of a MouseThe Death of a Mouse
The Death of a Mouse
Geert Bevin
 
APEX Connect 2019 - SQL Tuning 101
APEX Connect 2019 - SQL Tuning 101APEX Connect 2019 - SQL Tuning 101
APEX Connect 2019 - SQL Tuning 101
Connor McDonald
 
Building web APIs in PHP with Zend Expressive
Building web APIs in PHP with Zend ExpressiveBuilding web APIs in PHP with Zend Expressive
Building web APIs in PHP with Zend Expressive
Zend by Rogue Wave Software
 

Similar to Семантика final полей в java (20)

Computer System Oranization-R.D.Sivakumar
Computer System Oranization-R.D.SivakumarComputer System Oranization-R.D.Sivakumar
Computer System Oranization-R.D.Sivakumar
 
Triển khai Modsecurity vào hệ thống NMS - Quan Minh Tâm
Triển khai Modsecurity vào hệ thống NMS - Quan Minh TâmTriển khai Modsecurity vào hệ thống NMS - Quan Minh Tâm
Triển khai Modsecurity vào hệ thống NMS - Quan Minh Tâm
 
Zvika markfeld
Zvika markfeldZvika markfeld
Zvika markfeld
 
RoSE Framework
RoSE FrameworkRoSE Framework
RoSE Framework
 
Boetticher Presentation Promise 2008v2
Boetticher Presentation Promise 2008v2Boetticher Presentation Promise 2008v2
Boetticher Presentation Promise 2008v2
 
Cisco Connect Toronto 2018 sixty to zero
Cisco Connect Toronto 2018   sixty to zeroCisco Connect Toronto 2018   sixty to zero
Cisco Connect Toronto 2018 sixty to zero
 
DEF CON 27 - MICHAEL LEIBOWITZ and TOPHER TIMZEN - edr is coming hide yo sht
DEF CON 27 - MICHAEL LEIBOWITZ and TOPHER TIMZEN - edr is coming hide yo shtDEF CON 27 - MICHAEL LEIBOWITZ and TOPHER TIMZEN - edr is coming hide yo sht
DEF CON 27 - MICHAEL LEIBOWITZ and TOPHER TIMZEN - edr is coming hide yo sht
 
Cisco Connect Ottawa 2018 sixty to zero
Cisco Connect Ottawa 2018 sixty to zeroCisco Connect Ottawa 2018 sixty to zero
Cisco Connect Ottawa 2018 sixty to zero
 
Building Pageless Apps with Rails and Backbone.js
Building Pageless Apps with Rails and Backbone.jsBuilding Pageless Apps with Rails and Backbone.js
Building Pageless Apps with Rails and Backbone.js
 
Latin America Tour 2019 - slow data and sql processing
Latin America Tour 2019  - slow data and sql processingLatin America Tour 2019  - slow data and sql processing
Latin America Tour 2019 - slow data and sql processing
 
톰캣 #05-배치
톰캣 #05-배치톰캣 #05-배치
톰캣 #05-배치
 
Critical software developement
Critical software developementCritical software developement
Critical software developement
 
BSides IR in Heterogeneous Environment
BSides IR in Heterogeneous EnvironmentBSides IR in Heterogeneous Environment
BSides IR in Heterogeneous Environment
 
Learning to Rank Relevant Malware Strings Using Weak Supervision
Learning to Rank Relevant Malware Strings Using Weak SupervisionLearning to Rank Relevant Malware Strings Using Weak Supervision
Learning to Rank Relevant Malware Strings Using Weak Supervision
 
"Quantum" Performance Effects
"Quantum" Performance Effects"Quantum" Performance Effects
"Quantum" Performance Effects
 
Super1
Super1Super1
Super1
 
Codeception Testing Framework -- English #phpkansai
Codeception Testing Framework -- English #phpkansaiCodeception Testing Framework -- English #phpkansai
Codeception Testing Framework -- English #phpkansai
 
The Death of a Mouse
The Death of a MouseThe Death of a Mouse
The Death of a Mouse
 
APEX Connect 2019 - SQL Tuning 101
APEX Connect 2019 - SQL Tuning 101APEX Connect 2019 - SQL Tuning 101
APEX Connect 2019 - SQL Tuning 101
 
Building web APIs in PHP with Zend Expressive
Building web APIs in PHP with Zend ExpressiveBuilding web APIs in PHP with Zend Expressive
Building web APIs in PHP with Zend Expressive
 

Recently uploaded

Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise EditionWhy Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Envertis Software Solutions
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
Green Software Development
 
Revolutionizing Visual Effects Mastering AI Face Swaps.pdf
Revolutionizing Visual Effects Mastering AI Face Swaps.pdfRevolutionizing Visual Effects Mastering AI Face Swaps.pdf
Revolutionizing Visual Effects Mastering AI Face Swaps.pdf
Undress Baby
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
Google
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
Hironori Washizaki
 
What is Master Data Management by PiLog Group
What is Master Data Management by PiLog GroupWhat is Master Data Management by PiLog Group
What is Master Data Management by PiLog Group
aymanquadri279
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
lorraineandreiamcidl
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
Rakesh Kumar R
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
Łukasz Chruściel
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
SOCRadar
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
Peter Muessig
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
Grant Fritchey
 
openEuler Case Study - The Journey to Supply Chain Security
openEuler Case Study - The Journey to Supply Chain SecurityopenEuler Case Study - The Journey to Supply Chain Security
openEuler Case Study - The Journey to Supply Chain Security
Shane Coughlan
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
Rakesh Kumar R
 
Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
Sven Peters
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Neo4j
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
Peter Muessig
 

Recently uploaded (20)

Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise EditionWhy Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
 
Revolutionizing Visual Effects Mastering AI Face Swaps.pdf
Revolutionizing Visual Effects Mastering AI Face Swaps.pdfRevolutionizing Visual Effects Mastering AI Face Swaps.pdf
Revolutionizing Visual Effects Mastering AI Face Swaps.pdf
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
 
What is Master Data Management by PiLog Group
What is Master Data Management by PiLog GroupWhat is Master Data Management by PiLog Group
What is Master Data Management by PiLog Group
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
 
openEuler Case Study - The Journey to Supply Chain Security
openEuler Case Study - The Journey to Supply Chain SecurityopenEuler Case Study - The Journey to Supply Chain Security
openEuler Case Study - The Journey to Supply Chain Security
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
 
Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
 

Семантика final полей в java

  • 1. Ñåìàíòèêà final ïîëåé â java Âëàäèìèð Ñèòíèêîâ, Âàëåíòèí Êîâàëåíêî sitnikov@netcracker.com, @VladimirSitnikv NetCracker Ñåíòÿáðü 2014
  • 2. Ââåäåíèå Ïðèìåðû 2 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 3. Çà÷åì final â JMM? 3 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 4. Áåçîïàñíîñòü String String s = ... if ( checkAccess (s)) { return readFile (s); } Ïðàâèëüíî ëè ïðîâåðÿþòñÿ ïðàâà íà äîñòóï ê ôàéëó? 4 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 5. Áåç îïàñíîñòü String â java 1.4 String s = ... if ( checkAccess (s)) { return readFile (s); } Îòâåò çàâèñèò îò âåðñèè, è â java 1.4 âîçìîæíû ïðîáëåìû 5 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 6. Áåç îïàñíîñòü String â java 1.4 String s = GLOBAL ; if ( checkAccess (s)) { return readFile (s); } HackThread GLOBAL = "/tmp/ etc / passwd " . substring (4); Íàïðèìåð: HackThread âûïîëíÿåò .substring(4) è êîâàðíî ïåðåäà¼ò åãî â ïîòîê, ÷èòàþùèé ôàéëû 6 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 7. Áåç îïàñíîñòü String â java 1.4 String s = GLOBAL ; if ( checkAccess (s)) { return readFile (s); } HackThread GLOBAL = "/tmp/ etc / passwd " . substring (4); Â java 1.4 substring-ñòðîêà ññûëàåòñÿ íà òîò æå ìàññèâ ñèìâîëîâ, è âñ¼ îïðåëåäÿåòñÿ ïîëÿìè String#offset è String#size 7 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 8. Áåç îïàñíîñòü String â java 1.4 String s = GLOBAL ; if ( checkAccess (s)) { return readFile (s); } HackThread GLOBAL = "/tmp/ etc / passwd " . substring (4); race race Ñèíõðîíèçàöèè ìåæäó ïîòîêàìè íåò, ïîýòîìó ÷èòàòåëü ìîæåò óâèäåòü íåäîèíèöèàëèçèðîâàííûé îáúåêò-ñòðîêó 8 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 9. Áåç îïàñíîñòü String â java 1.4 String s = GLOBAL ; if ( checkAccess (s)) { return readFile (s); } HackThread GLOBAL = "/tmp/ etc / passwd " . substring (4); race race checkAccess ìîæåò óâèäåòü "/tmp/etc/passwd", à readFile óæå "/etc/passwd" 9 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 10. Áåç îïàñíîñòü String â java 1.4 String s = GLOBAL ; if ( checkAccess (s)) { return readFile (s); } HackThread GLOBAL = "/tmp/ etc / passwd " . substring (4); race race checkAccess ìîæåò óâèäåòü "/tmp/etc/passwd", à readFile óæå "/etc/passwd" Äàæå ñèíõðîíèçàöèÿ íà s è volatile íå ñïàñóò! 10 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 11. Áåçîïàñíîñòü String â java 1.5+ String s = GLOBAL ; if ( checkAccess (s)) { return readFile (s); } HackThread GLOBAL = "/tmp/ etc / passwd " . substring (4); hb hb  java 1.5+ final çàùèùàåò îò íåäîñîçäàííûõ îáúåêòîâ è HackTread 11 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 12. Çà÷åì íàì JMM? 12 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 13. Êîä-çàãàäêà int x = 1; public int neverTryThisAtHome () { int i = this .x; // it is 1, isn ’t it? this . setX (2); // just updates x to 2 return this .x - i; // 2 - 1 == ...? } Êàêèå çíà÷åíèÿ ìîãóò âåðíóòüñÿ? 1? 0? -1? 13 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 14. Êîä-çàãàäêà int x = 1; public int neverTryThisAtHome () { int i = this .x; // it is 1, isn ’t it? this . setX (2); // just updates x to 2 return this .x - i; // 2 - 1 == ...? } Äà, òóò âåðí¼òñÿ 1 14 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 15. Êîä-çàãàäêà final int x = 1; public int neverTryThisAtHome () { int i = this .x; // it is 1, isn ’t it? this . setX (2); // just updates x to 2 return this .x - i; // 2 - 1 == ...? } À òåïåðü äîáàâèì íîæåê final 15 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 16. Êîä-çàãàäêà final int x = 1; public int neverTryThisAtHome () { int i = this .x; // it is 1, isn ’t it? this . setX (2); // just updates x to 2 return this .x - i; // 2 - 1 == ...? } Ñïåöèôèêàöèÿ ðàçðåøàåò âñå âàðèàíòû: 1, 0, è äàæå -1! (ñì. ïðèìåð 17.5.3-1) 16 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 17. Íåìíîãî òåîðèè 17 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 18. Ïðîãðàììíûé ïîðÿäîê (program order) I Îòðàæàåò òî, â êàêîì ïîðÿäêå íàïèñàí èñõîäíûé êîä 18 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 19. Ïðîãðàììíûé ïîðÿäîê (program order) I Îòðàæàåò òî, â êàêîì ïîðÿäêå íàïèñàí èñõîäíûé êîä I Êîìïèëÿòîðó çàïðåùåíî ïåðåóïîðÿäî÷èâàòü, èãíîðèðîâàòü è ìåíÿòü îïåðàöèè, åñëè ýòî íàðóøèò program order 19 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 20. Ïðîãðàììíûé ïîðÿäîê (program order) I Îòðàæàåò òî, â êàêîì ïîðÿäêå íàïèñàí èñõîäíûé êîä I Êîìïèëÿòîðó çàïðåùåíî ïåðåóïîðÿäî÷èâàòü, èãíîðèðîâàòü è ìåíÿòü îïåðàöèè, åñëè ýòî íàðóøèò program order I Íî ýòî íå çíà÷èò, ÷òî âñ¼ âûïîëíÿåòñÿ èìåííî òàê, êàê â èñõîäíîì êîäå 20 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 21. Ïðîãðàììíûé ïîðÿäîê (program order) I Îòðàæàåò òî, â êàêîì ïîðÿäêå íàïèñàí èñõîäíûé êîä I Êîìïèëÿòîðó çàïðåùåíî ïåðåóïîðÿäî÷èâàòü, èãíîðèðîâàòü è ìåíÿòü îïåðàöèè, åñëè ýòî íàðóøèò program order I Íî ýòî íå çíà÷èò, ÷òî âñ¼ âûïîëíÿåòñÿ èìåííî òàê, êàê â èñõîäíîì êîäå I Íàïðèìåð: äëÿ îïåðàöèé íàä ëîêàëüíûìè ïåðåìåííûìè program order âîîáùå íå îïðåäåë¼í 21 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 22. ×àñòè÷íûé ïîðÿäîê (partial order) I  ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî "partial order" 22 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 23. ×àñòè÷íûé ïîðÿäîê (partial order) I  ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî "partial order" I ×àñòè÷íûì ïîðÿäêîì hb ! ÿâëÿåòñÿ áèíàðíîå îòíîøåíèå, êîòîðîå: 23 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 24. ×àñòè÷íûé ïîðÿäîê (partial order) I  ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî partial order I ×àñòè÷íûì ïîðÿäêîì hb ! ÿâëÿåòñÿ áèíàðíîå îòíîøåíèå, êîòîðîå: I Ðåôëåêñèâíî: äëÿ ëþáîãî ýëåìåíòà x âûïîëíÿåòñÿ x hb ! x 24 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 25. ×àñòè÷íûé ïîðÿäîê (partial order) I  ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî partial order I ×àñòè÷íûì ïîðÿäêîì hb ! ÿâëÿåòñÿ áèíàðíîå îòíîøåíèå, êîòîðîå: I Ðåôëåêñèâíî: äëÿ ëþáîãî ýëåìåíòà x âûïîëíÿåòñÿ x hb ! x I Àíòèñèììåòðè÷íî: åñëè x hb ! y è y hb ! x, òî x è y ýòî îäíî è òî æå 25 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 26. ×àñòè÷íûé ïîðÿäîê (partial order) I  ãëàâå 17 JLS 8 ðàç óïîìèíàåòñÿ ñëîâî partial order I ×àñòè÷íûì ïîðÿäêîì hb ! ÿâëÿåòñÿ áèíàðíîå îòíîøåíèå, êîòîðîå: I Ðåôëåêñèâíî: äëÿ ëþáîãî ýëåìåíòà x âûïîëíÿåòñÿ x hb ! x I Àíòèñèììåòðè÷íî: åñëè x hb ! y è y hb ! x, òî x è y ýòî îäíî è òî æå I Òðàíçèòèâíî: åñëè x hb ! y è y hb ! z, òî x hb ! z 26 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 27. Happens-before I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå 27 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 28. Happens-before I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå I Happens-before ýòî ÷àñòè÷íûé ïîðÿäîê, êîòîðûé äîëæåí ñîáëþäàòüñÿ 28 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 29. Happens-before I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå I Happens-before ýòî ÷àñòè÷íûé ïîðÿäîê, êîòîðûé äîëæåí ñîáëþäàòüñÿ I Çàïðåùåíî âèäåòü áóäóùèå çàïèñè (r hb ! w) 29 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 30. Happens-before I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå I Happens-before ýòî ÷àñòè÷íûé ïîðÿäîê, êîòîðûé äîëæåí ñîáëþäàòüñÿ I Çàïðåùåíî âèäåòü áóäóùèå çàïèñè (r hb ! w) I È òå, êîòîðûå áûëè ïåðåò¼ðëèñü â hb ïîðÿäêå: w1 hb ! w2 hb ! r 30 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 31. Happens-before I Îñíîâíîé ïðèíöèï JMM: ðàññìîòðèì âñå âîçìîæíûå âûïîëíåíèÿ è îòêèíåì íåïðàâèëüíûå I Happens-before ýòî ÷àñòè÷íûé ïîðÿäîê, êîòîðûé äîëæåí ñîáëþäàòüñÿ I Çàïðåùåíî âèäåòü áóäóùèå çàïèñè (r hb ! w) I È òå, êîòîðûå áûëè ïåðåò¼ðëèñü â hb ïîðÿäêå: w1 hb ! w2 hb ! r I È òå, êîòîðûå çàïðåùåíû ïðîñòî òàê: 17.4.8 executions and causality requirements 31 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 32. Ñåìàíòèêà final ïîëåé îäíèì ñëàéäîì w hb ! f hb ! a mc ! r2 ) w hb ! r1 dr ! r2 I w è r2 – èíòåðåñóþùèå íàñ íàñ çàïèñü è ÷òåíèå 32 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 33. Ñåìàíòèêà final ïîëåé îäíèì ñëàéäîì w hb ! f hb ! a mc ! r2 ) w hb ! r1 dr ! r2 I w è r2 – èíòåðåñóþùèå íàñ íàñ çàïèñü è ÷òåíèå I f – çàìîðîçêà final ïîëÿ, êîòîðîå ÷èòàåòñÿ â r1 33 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 34. Ñåìàíòèêà final ïîëåé îäíèì ñëàéäîì w hb ! f hb ! a mc ! r2 ) w hb ! r1 dr ! r2 I Åñëè åäèíñòâåííûé ïóòü îò çàïèñè ê ÷òåíèþ èä¼ò ÷åðåç âñå ýòè ñòðåëî÷êè, òî ìû íå ìîæåì óâèäåòü áîëåå ðàííèå çàïèñè 34 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 35. Ñåìàíòèêà final ïîëåé îäíèì ñëàéäîì w hb ! f hb ! a mc ! r2 ) w hb ! r1 dr ! r2 I Åñëè åäèíñòâåííûé ïóòü îò çàïèñè ê ÷òåíèþ èä¼ò ÷åðåç âñå ýòè ñòðåëî÷êè, òî ìû íå ìîæåì óâèäåòü áîëåå ðàííèå çàïèñè I Åñëè ïóòåé áîëüøå îäíîãî – êàê ïîâåç¼ò 35 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 36. Freeze action w hb ! f hb ! a mc ! r1 dr ! r2 36 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 37. Freeze action w hb ! f hb ! a mc ! r1 dr ! r2 Freeze action 37 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 38. Freeze action w hb ! f hb ! a mc ! r1 dr ! r2 Freeze action Ïîëå Freeze ñëó÷àåòñÿ â êîíöå êîíñòðóêòîðà è ìîðîçèò final ïîëÿ 38 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 39. Dereference chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 T local = GLOBAL ; r1 int localX = local .x; r2 I r2 ÷èòàåò ïîëå îáúåêòà 39 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 40. Dereference chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 T local = GLOBAL ; r1 int localX = local .x; r2 I r2 ÷èòàåò ïîëå îáúåêòà I Ïîòîê íå ñîçäàâàë îáúåêò 40 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 41. Dereference chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 T local = GLOBAL ; r1 int localX = local .x; r2 I r2 ÷èòàåò ïîëå îáúåêòà I Ïîòîê íå ñîçäàâàë îáúåêò I Çíà÷èò, ãäå-òî ìû äîëæíû áûëè ÷èòàòü àäðåñ ýòîãî îáúåêòà 41 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 42. Dereference chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 T local = GLOBAL ; r1 int localX = local .x; r2 dr I r2 ÷èòàåò ïîëå îáúåêòà I Ïîòîê íå ñîçäàâàë îáúåêò I Çíà÷èò, ãäå-òî ìû äîëæíû áûëè ÷èòàòü àäðåñ ýòîãî îáúåêòà I Ýòî íàçûâàåòñÿ r1 dr ! r2 42 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 43. Dereference chain äâà ïîòîêà w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T localA = new T(); GLOBAL = localA ; Thread 2 T localB = GLOBAL ; r1 if ( localB != null ) { int localX = localB .x; r2 } dr r1 dr ! r2 (÷èòàåì ïîëå íåñîçäàííîãî íàìè îáúåêòà) 43 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 44. Dereference chain äâà ïîòîêà w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T localA = new T(); a GLOBAL = localA ; Thread 2 T localB = GLOBAL ; r1 if ( localB != null ) { int localX = localB .x; r2 } dr dr? Åñòü ëè a dr ! r2? 44 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 45. Dereference chain äâà ïîòîêà w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T localA = new T(); a GLOBAL = localA ; Thread 2 T localB = GLOBAL ; r1 if ( localB != null ) { int localX = localB .x; r2 } dr dr? Ìåæäó ïîòîêàìè dr íå âîçíèêàåò! 45 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 46. Dereference chain: êîíòðîëüíûé âwûñòðåë hb ! f hb ! a mc ! r1 dr ! r2 T local = GLOBAL ; ra local = GLOBAL ; rb int localX = local .x; r2 Åñòü ëè çäåñü dr ? 46 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 47. Dereference chain: êîíòðîëüíûé âwûñòðåë hb ! f hb ! a mc ! r1 dr ! r2 T local = GLOBAL ; ra local = GLOBAL ; rb int localX = local .x; r2 dr? dr? Îäèí èç ra dr ! r2 èëè rb dr ! r2 òî÷íî äîëæåí áûòü, íî òî÷íåå ñêàçàòü íåâîçìîæíî 47 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 48. Memory chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T o = new T (); GL = o; w1 Thread 2 T o = GL; r1 GL2 = o; Thread 3 T o = GL2; int r = o.x; mc Åñëè ÷òåíèå âèäèò çàïèñü, òî w1 mc ! r1 48 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 49. Memory chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T o = new T (); GL = o; w1 Thread 2 T o = GL; r1 GL2 = o; w2 Thread 3 T o = GL2; int r = o.x; mc mc Åñëè ïèøåì àäðåñ ñîçäàííîãî âðàãîì îáúåêòà, òî r1 mc ! w2 49 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 50. Memory chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T o = new T (); GL = o; w1 Thread 2 T o = GL; r1 GL2 = o; w2 Thread 3 T o = GL2; r3 int r = o.x; mc mc mc r3 âèäèò w2 ) w2 mc ! r3 50 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 51. Memory chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T o = new T (); GL = o; w1 Thread 2 T o = GL; r1 GL2 = o; w2 Thread 3 T o = GL2; r3 int r = o.x; r4 mc mc mc dr r3 dr ! r4 (÷èòàåì ïîëå îáúåêòà) 51 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 52. Memory chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T o = new T (); GL = o; w1 Thread 2 T o = GL; r1 GL2 = o; w2 Thread 3 T o = GL2; r3 int r = o.x; r4 mc mc mc dr mc r3 dr ! r4 (÷èòàåì ïîëå îáúåêòà) ) r3 mc ! r4 52 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 53. Memory chain: ÷òî ýòî? w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T o = new T (); GL = o; w1 Thread 2 T o = GL; r1 GL2 = o; w2 Thread 3 T o = GL2; r3 int r = o.x; r4 mc mc mc dr mc mc mc òðàíçèòèâíî (ò.ê. ÷àñòè÷íûé ïîðÿäîê) ) w1 mc ! r4 53 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 54. Ââåäåíèå Ïðèìåðû 54 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 55. Disclaimer I Âñå ïðèìåðû îïàñíî ñèíõðîíèçèðîâàíû (èíà÷å çà÷åì ìû ñîáðàëèñü?) 55 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 56. Disclaimer I Âñå ïðèìåðû îïàñíî ñèíõðîíèçèðîâàíû (èíà÷å çà÷åì ìû ñîáðàëèñü?) I Ñëó÷àè ÷òåíèÿ null íå ðàññìàòðèâàåì (äàæå åñëè îíè âîçìîæíû) 56 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 57. Disclaimer I Âñå ïðèìåðû îïàñíî ñèíõðîíèçèðîâàíû (èíà÷å çà÷åì ìû ñîáðàëèñü?) I Ñëó÷àè ÷òåíèÿ null íå ðàññìàòðèâàåì (äàæå åñëè îíè âîçìîæíû) I Ïðè ñîñòàâëåíèè ñëàéäîâ ïîñòðàäàë íå îäèí ìîçã 57 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 58. Ýòàëîííûé final (1) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w }}; GLOBAL = l; Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; r2 } Âîçìîæíî ëè â result ïîëó÷èòü 0? 58 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 59. Ýòàëîííûé final (1) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w }}; f GLOBAL = l; a Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; } hb hb Äåéñòâèÿ â îäíîì ïîòîêå îáðàçóþò happens-before: w hb ! f , f hb ! a 59 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 60. Ýòàëîííûé final (1) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w }}; f GLOBAL = l; a Thread 2 T o = GLOBAL ; r0 if (o != null ) { int result = o.fx; } hb hb mc r0 âèäèò çàïèñü a : a mc ! r0 60 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 61. Ýòàëîííûé final (1) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w }}; f GLOBAL = l; a Thread 2 T o = GLOBAL ; r0 if (o != null ) { int result = o.fx; r1 } hb hb mc dr Ïîòîê 2 íå ñîçäàâàë îáúåêò, r1 ÷èòàåò åãî ïîëå, à r ýòî åäèíñòâåííîå ÷òåíèå àäðåñà îáúåêòà, ïîýòîìó dereference chain: r0 dr ! r1 61 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 62. Ýòàëîííûé final (1) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w }}; f GLOBAL = l; a Thread 2 T o = GLOBAL ; r0 if (o != null ) { int result = o.fx; r1 } hb hb mc dr mc r0 dr ! r1 ) r0 mc ! r1 62 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 63. Ýòàëîííûé final (1) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w }}; f GLOBAL = l; a Thread 2 T o = GLOBAL ; r0 if (o != null ) { int result = o.fx; r1 } hb hb mc mc mc a mc ! r1 ( mc òðàíçèòèâíî) 63 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 64. Ýòàëîííûé final (1) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w }}; f GLOBAL = l; a Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; r1 r2 } hb hb mc dr Âîçüì¼ì r2 = r 1, òîãäà r1 dr ! r2 ( dr ðåôëåêñèâíî) 64 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 65. Ýòàëîííûé final (1) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w }}; f GLOBAL = l; a Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; r1 r2 } hb hb mc dr hb* Íàøëè âñ¼ íåîáõîäèìîå äëÿ HB: w hb ! f hb ! a mc ! r2 ) w hb ! r1 dr ! r2 65 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 66. Ýòàëîííûé final (1) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w }}; f GLOBAL = l; a Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; r1 r2 } hb hb mc dr hb* (w hb ! r2) ) result 2 f42g 66 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 67. Ìàññèâ âíóòðè final (2) w hb ! f hb ! a mc ! r1 dr ! r2 T l = new T() {{ int [] u = new int [1]; u [0] = 42; w fx = u; }}; GLOBAL = l; T o = GLOBAL ; if (o != null ) { int [] lfx = o.fx; int result = lfx [0]; r2 } Âîçìîæíî ëè â result ïîëó÷èòü 0? 67 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 68. Ìàññèâ âíóòðè final (2) w hb ! f hb ! a mc ! r1 dr ! r2 T l = new T() {{ int [] u = new int [1]; u [0] = 42; w fx = u; }}; f GLOBAL = l; a T o = GLOBAL ; if (o != null ) { int [] lfx = o.fx; int result = lfx [0]; r2 } hb hb Äåéñòâèÿ â îäíîì ïîòîêå îáðàçóþò happens-before: w hb ! f , f hb ! a 68 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 69. Ìàññèâ âíóòðè final (2) w hb ! f hb ! a mc ! r1 dr ! r2 T l = new T() {{ int [] u = new int [1]; u [0] = 42; w fx = u; }}; f GLOBAL = l; a T o = GLOBAL ; if (o != null ) { int [] lfx = o.fx; r1 int result = lfx [0]; r2 } hb hb mc r1 âèäèò çàïèñü a (ò.ê. ïðîñòîå final ïîëå): a mc ! r1 69 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 70. Ìàññèâ âíóòðè final (2) w hb ! f hb ! a mc ! r1 dr ! r2 T l = new T() {{ int [] u = new int [1]; u [0] = 42; w fx = u; }}; f GLOBAL = l; a T o = GLOBAL ; if (o != null ) { int [] lfx = o.fx; r1 int result = lfx [0]; r2 } hb hb mc dr Ïîòîê 2 íå ñîçäàâàë ìàññèâ, r2 ÷èòàåò åãî ýëåìåíò, r1 ýòî åäèíñòâåííîå ÷òåíèå àäðåñà ìàññèâà, ïîýòîìó dereference chain: r1 dr ! r2 70 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 71. Ìàññèâ âíóòðè final (2) w hb ! f hb ! a mc ! r1 dr ! r2 T l = new T() {{ int [] u = new int [1]; u [0] = 42; w fx = u; }}; f GLOBAL = l; a T o = GLOBAL ; if (o != null ) { int [] lfx = o.fx; r1 int result = lfx [0]; r2 } hb hb mc dr hb* Íàøëè âñ¼ íåîáõîäèìîå äëÿ HB: w hb ! f hb ! a mc ! r2 ) w hb ! r1 dr ! r2 71 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 72. Ìàññèâ âíóòðè final (2) w hb ! f hb ! a mc ! r1 dr ! r2 T l = new T() {{ int [] u = new int [1]; u [0] = 42; w fx = u; }}; f GLOBAL = l; a T o = GLOBAL ; if (o != null ) { int [] lfx = o.fx; r1 int result = lfx [0]; r2 } hb hb mc dr hb* (w hb ! r2) ) result 2 f42g 72 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 73. Ìàññèâ íàîáîðîò (2.1) w hb ! f hb ! a mc ! r1 dr ! r2 T l = new T() {{ int [] u = new int [1]; fx = u; // (!) u [0] = 42; w }}; GLOBAL = l; T o = GLOBAL ; if (o != null ) { int [] lfx = o.fx; int result = lfx [0]; } Âîçìîæíî ëè â result ïîëó÷èòü 0? 73 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 74. Ìàññèâ íàîáîðîò (2.1) w hb ! f hb ! a mc ! r1 dr ! r2 T l = new T() {{ int [] u = new int [1]; fx = u; // (!) u [0] = 42; w }}; f GLOBAL = l; a T o = GLOBAL ; if (o != null ) { int [] lfx = o.fx; r1 int result = lfx [0]; r2 } hb hb mc dr hb Ñòðîèì hb òàê æå êàê è â ïðåäûäóùåì ñëó÷àå 74 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 75. Ìàññèâ íàîáîðîò (2.1) w hb ! f hb ! a mc ! r1 dr ! r2 T l = new T() {{ int [] u = new int [1]; fx = u; // (!) u [0] = 42; w }}; f GLOBAL = l; a T o = GLOBAL ; if (o != null ) { int [] lfx = o.fx; r1 int result = lfx [0]; r2 } hb hb mc dr hb (w hb ! r2) ) result 2 f42g Ðåçóëüòàò íå çàâèñèò îò ïîðÿäêà çàïèñè final ïîëåé! 75 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 76. Óòåêàíèå this (3) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLOBAL = this ; }}; Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; r2 } Âîçìîæíî ëè â result ïîëó÷èòü 0? 76 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 77. Óòåêàíèå this (3) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLOBAL = this ; a }}; f Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; r2 } hb hb Äåéñòâèÿ â îäíîì ïîòîêå îáðàçóþò happens-before: w hb ! f , a hb ! f 77 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 78. Óòåêàíèå this (3) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLOBAL = this ; a }}; f Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; r2 } hb hb? hb Íî íàì-òî íóæíî f hb ! a! 78 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 79. Óòåêàíèå this (3) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLOBAL = this ; a }}; f Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; r2 } hb hb? hb Åñëè a hb ! f è f hb ! a, òî a = f (àíòèñèììåòðè÷íîñòü hb ) Íî ïóáëèêàöèÿ ññûëêè ýòî íèêàê íå freeze action! 79 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 80. Óòåêàíèå this (3) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLOBAL = this ; a }}; f Thread 2 T o = GLOBAL ; if (o != null ) { int result = o.fx; r2 } hb hb? hb Íåò hb , ïîýòîìó âîçìîæíû âñå âàðèàíòû: result 2 f0; 42g 80 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 81. Âðåäèòåëüñêîå óòåêàíèå this (4) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLb = this ; }}; GLa = l; Thread 2 T u = GLb; T o = GLa; if (o != null ) { int result = o.fx; r2 } Âîçìîæíî ëè â result ïîëó÷èòü 0? 81 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 82. Âðåäèòåëüñêîå óòåêàíèå this (4) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLb = this ; b }}; f GLa = l; a Thread 2 T u = GLb; T o = GLa; if (o != null ) { int result = o.fx; } hb hb hb? Äåéñòâèÿ â îäíîì ïîòîêå îáðàçóþò happens-before: w hb ! f , f hb ! a 82 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 83. Âðåäèòåëüñêîå óòåêàíèå this (4) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLb = this ; b }}; f GLa = l; a Thread 2 T u = GLb; T o = GLa; ra if (o != null ) { int result = o.fx; } hb hb hb? mc Ïóñòü âòîðîé ïîòîê óâèäåë GLa, òîãäà a mc ! ra! 83 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 84. Âðåäèòåëüñêîå óòåêàíèå this (4) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLb = this ; b }}; f GLa = l; a Thread 2 T u = GLb; rb T o = GLa; ra if (o != null ) { int result = o.fx; r1 } hb hb hb? mc dr? dr? Ãäå-òî äîëæíî áûòü dr : rb dr ! r1 èëè ra dr ! r1 84 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 85. Âðåäèòåëüñêîå óòåêàíèå this (4) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLb = this ; b }}; f GLa = l; a Thread 2 T u = GLb; rb T o = GLa; ra if (o != null ) { int result = o.fx; r1 } hb hb hb? mc dr? dr ! r 1, òî ìû ïîïàëè, ò.ê. w hb Åñëè rb dr ! r1 íå ñòðîèòñÿ 85 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 86. Âðåäèòåëüñêîå óòåêàíèå this (4) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 T l = new T() {{ fx = 42; w GLb = this ; b }}; f GLa = l; a Thread 2 T u = GLb; rb T o = GLa; ra if (o != null ) { int result = o.fx; r1 } hb hb hb? mc dr? dr Âûâîä: åñëè íàø ïîòîê óæå ÷èòàë îáúåêò ñ íåçàìîðîæåííûìè ïîëÿìè, òî ãàðàíòèé final semantics íåò! 86 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 87. Reflection in action (5) w hb ! f hb ! a mc ! r1 dr ! r2 T t = new T() {{ fu = new U (); fu.x = 1; w1 }}; GLOBAL = t; U w = new U (); w.x = 42; w2 reflectSet (t.fu , w); Thread 2 T t = GLOBAL ; if (t != null ) { U u = t.fu; int result = u.x; r2 } Âîçìîæíî ëè â result ïîëó÷èòü 0? 87 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 88. Reflection in action (5) w hb ! f hb ! a mc ! r1 dr ! r2 T t = new T() {{ fu = new U (); fu.x = 1; }}; GLOBAL = t; U w = new U (); w.x = 42; w2 reflectSet (t.fu , w); Thread 2 T t = GLOBAL ; if (t != null ) { U u = t.fu; int result = u.x; r2 } hb*? Ïî-õîðîøåìó, íàì íóæíî w2 hb ! r2 (èíà÷å íå çàïðåùåíî âèäåòü çàïèñü 0 â w.x) 88 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 89. Reflection in action (5) w hb ! f hb ! a mc ! r1 dr ! r2 T t = new T() {{ fu = new U (); fu.x = 1; }}; GLOBAL = t; U w = new U (); w.x = 42; w2 reflectSet (t.fu , w); f2 Thread 2 T t = GLOBAL ; if (t != null ) { U u = t.fu; int result = u.x; r2 } hb*? f2 íå ïîäõîäèò äëÿ hb : íåò ïîäõîäÿùåãî f 2 hb ! a 89 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 90. Reflection in action (5) w hb ! f hb ! a mc ! r1 dr ! r2 T t = new T() {{ fu = new U (); fu.x = 1; }}; f1 GLOBAL = t; U w = new U (); w.x = 42; w2 reflectSet (t.fu , w); f2 Thread 2 T t = GLOBAL ; if (t != null ) { U u = t.fu; int result = u.x; r2 } hb*? hb? f1 òîæå íå ïîäõîäèò äëÿ hb : äîëæíî áûòü w2 hb ! f 1 90 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 91. Reflection in action (5) w hb ! f hb ! a mc ! r1 dr ! r2 T t = new T() {{ fu = new U (); fu.x = 1; }}; f1 GLOBAL = t; U w = new U (); w.x = 42; w2 reflectSet (t.fu , w); f2 Thread 2 T t = GLOBAL ; if (t != null ) { U u = t.fu; int result = u.x; r2 } hb*? hb? Ïîëó÷àåòñÿ, ÷òî ÷òåíèþ r2 íå çàïðåùåíî âèäåòü 0 91 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 92. Reflection in action (5) w hb ! f hb ! a mc ! r1 dr ! r2 T t = new T() {{ fu = new U (); fu.x = 1; }}; f1 GLOBAL = t; a U w = new U(); w.x = 42; w2 reflectSet (t.fu , w); f2 Thread 2 T t = GLOBAL ; if (t != null ) { U u = t.fu; int result = u.x; r2 } hb*? hb? Èòîãî: ïîñëå ïóáëèêàöèè ìåíÿòü final ïîëÿ îïàñíî result 2 f0; 1; 42g 92 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 93. ×èíèì reflection (5.1) w hb ! f hb ! a mc ! r1 dr ! r2 T t = new T() {{ fu = new U (); fu.x = 1; }}; U w = new U (); w.x = 42; reflectSet (t.fu , w); GLOBAL = t; a Thread 2 T t = GLOBAL ; if (t != null ) { U u = t.fu; int result = u.x; } Åñëè ïóáëèêîâàòü ññûëêó ïîñëå âñåõ èçìåíåíèé final ïîëåé, òî âñ¼ ðàáîòàåò: result 2 f1; 42g 93 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 94. Final wrapper (6) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 A a = new O() {{ fx = 42; w }}; GL = a; Thread 2 A a = GL; B = new B() {{ fb = o; }}; GL2 = b; Thread 3 B B = GL2; A a = b.fb; int r = a.fx; r2 Âîçìîæíî ëè â result ïîëó÷èòü 0? 94 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 95. Final wrapper (6) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 A a = new O() {{ fx = 42; w }}; GL = a; wa Thread 2 A a = GL; ra B = new B() {{ fb = o; wb }}; GL2 = b; Thread 3 B B = GL2; mc A a = b.fb; rb int r = a.fx; r1 mc rb âèäèò wb ) wb mc ! rb ra âèäèò çàïèñü wa : wa mc ! ra 95 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 96. Final wrapper (6) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 A a = new O() {{ fx = 42; w }}; GL = a; wa Thread 2 A a = GL; ra B = new B() {{ fb = o; wb }}; GL2 = b; Thread 3 B B = GL2; mc A a = b.fb; rb int r = a.fx; r1 mc mc Ïîòîê 2 ïèøåò àäðåñ ñîçäàííîãî âðàãîì îáúåêòà, ïîýòîìó ra mc ! wb 96 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 97. Final wrapper (6) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 A a = new O() {{ fx = 42; w }}; GL = a; wa Thread 2 A a = GL; ra B = new B() {{ fb = o; wb }}; GL2 = b; Thread 3 B B = GL2; mc A a = b.fb; rb int r = a.fx; r1 mc mc dr Ïîòîê 3 íå ñîçäàâàë îáúåêò A, r ÷èòàåò åãî ïîëå, à rb ýòî åäèíñòâåííîå ÷òåíèå àäðåñà îáúåêòà, ïîýòîìó dereference chain: rb dr ! r1 97 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 98. Final wrapper (6) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 A a = new O() {{ fx = 42; w }}; GL = a; wa Thread 2 A a = GL; ra B = new B() {{ fb = o; wb }}; GL2 = b; Thread 3 B B = GL2; mc A a = b.fb; rb int r = a.fx; r1 mc mc dr mc rb dr ! r1 ) rb mc ! r1 98 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 99. Final wrapper (6) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 A a = new O() {{ fx = 42; w }}; GL = a; wa Thread 2 A a = GL; ra B = new B() {{ fb = o; wb }}; GL2 = b; Thread 3 B B = GL2; mc A a = b.fb; rb int r = a.fx; r1 mc mc mc mc mc òðàíçèòèâíî (ò.ê. ÷àñòè÷íûé ïîðÿäîê) ) wa mc ! r1 99 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 100. Final wrapper (6) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 A a = new O() {{ fx = 42; w }}; f GL = a; wa Thread 2 A a = GL; ra B = new B() {{ fb = o; wb }}; GL2 = b; Thread 3 B B = GL2; A a = b.fb; rb int r = a.fx; r1 r2 mc dr Âîçüì¼ì r2 = r 1, òîãäà r1 dr ! r2 ( dr ðåôëåêñèâíî) 100 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 101. Final wrapper (6) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 A a = new O() {{ fx = 42; w }}; f GL = a; wa Thread 2 A a = GL; ra B = new B() {{ fb = o; wb }}; GL2 = b; Thread 3 B B = GL2; A a = b.fb; rb int r = a.fx; r1 r2 mc dr hb hb hb* Íàøëè âñ¼ íåîáõîäèìîå äëÿ HB: w hb ! f hb ! a mc ! r2 ) w hb ! r1 dr ! r2 101 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 102. Final wrapper (6) w hb ! f hb ! a mc ! r1 dr ! r2 Thread 1 A a = new O() {{ fx = 42; w }}; f GL = a; wa Thread 2 A a = GL; ra B = new B() {{ fb = o; wb }}; GL2 = b; Thread 3 B B = GL2; A a = b.fb; rb int r = a.fx; r1 r2 mc dr hb hb hb* (w hb ! r2) ) result 2 f42g 102 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved
  • 103. Âîïðîñû? 103 / 103 (c) Copyright 2014, NetCracker Technology Corp. All rights reserved