±¾ÎÄÊÇÁ½ÕµıʼÇÕûÀí¡£
CPU
»º´æ¼ÆËã»úÖеÄËùÓÐÔËËã²Ù×÷¶¼ÊÇÓÉCPU
Íê³ÉµÄ£¬CPU
Ö¸ÁîÖ´Ðйý³ÌÐèÒªÉæ¼°Êý¾Ý¶ÁÈ¡ºÍдÈë²Ù×÷£¬µ«ÊÇCPU
Ö»ÄÜ·ÃÎÊ´¦ÓÚÄÚ´æÖеÄÊý¾Ý£¬¶øÄÚ´æµÄËٶȺÍCPU
µÄËÙ¶ÈÊÇÔ¶Ô¶²»¶ÔµÈµÄ£¬Òò´Ë¾Í³öÏÖÁË»º´æÄ£ÐÍ£¬Ò²¾ÍÊÇÔÚCPU
ºÍÄÚ´æÖ®¼ä¼ÓÈëÁË»º´æ²ã¡£Ò»°ãÏÖ´úµÄCPU
»º´æ²ã·ÖΪÈý¼¶£¬·Ö±ð½ÐL1
»º´æ¡¢L2
»º´æºÍL3
»º´æ£¬¼òÂÔͼÈçÏ£º
L1
»º´æ£ºÈý¼¶»º´æÖзÃÎÊËÙ¶È×î¿ì£¬µ«ÊÇÈÝÁ¿×îС£¬ÁíÍâL1
»º´æ»¹±»»®·Ö³ÉÁËÊý¾Ý»º´æ£¨L1d
£¬data
Ê××Öĸ£©ºÍÖ¸Á´æ£¨L1i
£¬instruction
Ê××Öĸ£©L2
»º´æ£ºËٶȱÈL1
Âý£¬µ«ÊÇÈÝÁ¿±ÈL1
´ó£¬ÔÚÏÖ´úµÄ¶àºËCPU
ÖУ¬L2
Ò»°ã±»µ¥¸öºË¶ÀÕ¼L3
»º´æ£ºÈý¼¶»º´æÖÐËÙ¶È×îÂý£¬µ«ÊÇÈÝÁ¿×î´ó£¬ÏÖ´úCPU
ÖÐÒ²ÓÐL3
ÊǶàºË¹²ÏíµÄÉè¼Æ£¬±ÈÈçzen3
¼Ü¹¹µÄÉè¼Æ»º´æµÄ³öÏÖ£¬ÊÇΪÁ˽â¾öCPU
Ö±½Ó·ÃÎÊÄÚ´æЧÂʵÍϵÄÎÊÌ⣬CPU
½øÐÐÔËËãµÄʱºò£¬½«ÐèÒªµÄÊý¾Ý´ÓÖ÷´æ¸´ÖÆÒ»·Ýµ½»º´æÖУ¬ÒòΪ»º´æµÄ·ÃÎÊËٶȿìÓÚÄڴ棬ÔÚ¼ÆËãµÄʱºòÖ»ÐèÒª¶ÁÈ¡»º´æ²¢½«½á¹û¸üе½»º´æ£¬ÔËËã½áÊøÔÙ½«½á¹ûˢе½Ö÷´æ£¬ÕâÑù¾Í´ó´óÌá¸ßÁ˼ÆËãЧÂÊ£¬ÕûÌå½»»¥Í¼¼òÂÔÈçÏ£º
ËäÈ»»º´æµÄ³öÏÖ£¬´ó´óÌá¸ßÁËÍÌÍÂÄÜÁ¦£¬µ«ÊÇ£¬Ò²ÒýÈëÁËÒ»¸öеÄÎÊÌ⣬¾ÍÊÇ»º´æ²»Ò»Ö¡£±ÈÈ磬×î¼òµ¥µÄÒ»¸öi++
²Ù×÷£¬ÐèÒª½«ÄÚ´æÊý¾Ý¸´ÖÆÒ»·Ýµ½»º´æÖУ¬CPU
¶ÁÈ¡»º´æÖµ²¢½øÐиüУ¬ÏÈдÈ뻺´æ£¬ÔËËã½áÊøºóÔÙ½«»º´æÖÐеÄˢе½Äڴ棬¾ßÌå¹ý³ÌÈçÏ£º
i
µ½»º´æÖÐCPU
¶ÁÈ¡»º´æi
ÖеÄÖµi
½øÐмÓ1²Ù×÷ÕâÑùµÄi++
²Ù×÷ÔÚµ¥Ï̲߳»»á³öÏÖÎÊÌ⣬µ«ÔÚ¶àÏß³ÌÖУ¬ÒòΪÿ¸öÏ̶߳¼ÓÐ×Ô¼ºµÄ¹¤×÷Äڴ棨Ҳ½Ð±¾µØÄڴ棬ÊÇÏß³Ì×Ô¼ºµÄ»º´æ£©£¬±äÁ¿i
ÔÚ¶à¸öÏ̵߳ı¾µØÄÚ´æÖж¼´æÔÚÒ»¸ö¸±±¾£¬Èç¹ûÓÐÁ½¸öÏß³ÌÖ´ÐÐi++
²Ù×÷£º
i
³õʼֵΪ0i
µÄÖµ·ÅÈ뻺´æÖУ¬´Ëʱi
µÄֵΪ0£¬Ïß³ÌBҲͬÀí£¬·ÅÈ뻺´æÖеÄÖµÒ²ÊÇ0i
µÄÖµ¶¼ÊÇ1i
дÈëÖ÷Äڴ棬Ï൱ÓÚi
±»Á½´Î¸³ÖµÎª1i
µÄֵΪ1Õâ¸ö¾ÍÊǵäÐ͵Ļº´æ²»Ò»ÖÂÎÊÌ⣬Ö÷Á÷µÄ½â¾ö°ì·¨ÓУº
ÕâÊÇÒ»ÖÖ±¯¹ÛµÄʵÏÖ·½Ê½£¬¾ßÌåÀ´Ëµ£¬¾ÍÊÇͨ¹ý´¦ÀíÆ÷·¢³ölock
Ö¸ÁËøס×ÜÏߣ¬×ÜÏßÊÕµ½Ö¸Áîºó£¬»á×èÈûÆäËû´¦ÀíÆ÷µÄÇëÇó£¬Ö±µ½Õ¼ÓÃËøµÄ´¦ÀíÆ÷Íê³É²Ù×÷¡£ÌصãÊÇÖ»ÓÐÒ»¸öÇÀµ½×ÜÏßËøµÄ´¦ÀíÆ÷ÔËÐУ¬µ«ÊÇÕâÖÖ·½Ê½Ð§ÂʵÍÏ£¬Ò»µ©Ä³¸ö´¦ÀíÆ÷»ñÈ¡µ½ËøÆäËû´¦ÀíÆ÷Ö»ÄÜ×èÈûµÈ´ý£¬»áÓ°Ïì¶àºË´¦ÀíÆ÷µÄÐÔÄÜ¡£
ͼʾÈçÏ£º
»º´æÒ»ÖÂÐÔÐÒéÖÐ×î³öÃûµÄ¾ÍÊÇMESI
ÐÒ飬MESI
±£Ö¤ÁËÿһ¸ö»º´æÖÐʹÓõĹ²Ïí±äÁ¿µÄ¸±±¾¶¼ÊÇÒ»Öµġ£´óÖÂ˼ÏëÊÇ£¬CPU
²Ù×÷»º´æÖеÄÊý¾Ýʱ£¬Èç¹û·¢ÏָñäÁ¿ÊÇÒ»¸ö¹²Ïí±äÁ¿£¬²Ù×÷ÈçÏ£º
CPU
½«¸Ã±äÁ¿µÄ»º´æÐÐÉèÖÃΪÎÞЧ״̬£¨Invalid
£©£¬ÆäËûCPU
½øÐиñäÁ¿µÄ¶ÁȡʱÐèÒªµ½Ö÷´æÖÐÔٴλñÈ¡¾ßÌåÀ´Ëµ£¬MESI
Öй涨ÁË»º´æÐÐʹÓÃ4ÖÖ״̬±ê¼Ç£º
M
£ºModified
£¬±»ÐÞ¸ÄE
£ºExclusive
£¬¶ÀÏíµÄS
£ºShared
£¬¹²ÏíµÄI
£ºInvalid
£¬ÎÞЧµÄÓйØMESI
ÏêϸµÄʵÏÖ³¬³öÁ˱¾Îĵķ¶Î§£¬ÏëÒªÏêϸÁ˽â¿ÉÒԲο¼´Ë´¦»ò´Ë´¦¡£
JMM
¿´ÍêÁËCPU
»º´æÔÙÀ´¿´Ò»ÏÂJMM
£¬Ò²¾ÍÊÇJava
ÄÚ´æÄ£ÐÍ£¬Ö¸¶¨ÁËJVM
ÈçºÎÓë¼ÆËã»úµÄÖ÷´æ½øÐй¤×÷£¬Í¬Ê±Ò²¾ö¶¨ÁËÒ»¸öÏ̶߳Թ²Ïí±äÁ¿µÄдÈëºÎʱ¶ÔÆäËûÏ߳̿ɼû£¬JMM
¶¨ÒåÁËÏ̺߳ÍÖ÷ÄÚ´æÖ®¼äµÄ³éÏó¹Øϵ£¬¾ßÌåÈçÏ£º
JMM
ÄÚ´æÄ£ÐÍÒ»ÑùÒ²ÊÇÒ»¸ö³éÏó¸ÅÄÆäʵ²¢²»´æÔÚ£¬º¸ÇÁË»º´æ¡¢¼Ä´æÆ÷¡¢±àÒëÆÚÓÅ»¯ÒÔ¼°Ó²¼þµÈ¼òÂÔͼÈçÏ£º
ÓëMESI
ÀàËÆ£¬Èç¹ûÒ»¸öÏß³ÌÐÞ¸ÄÁ˹²Ïí±äÁ¿£¬Ë¢Ðµ½Ö÷ÄÚ´æºó£¬ÆäËûÏ̶߳ÁÈ¡¹¤×÷ÄÚ´æµÄʱºò·¢ÏÖ»º´æʧЧ£¬»á´ÓÖ÷ÄÚ´æÔٴζÁÈ¡µ½¹¤×÷ÄÚ´æÖС£
¶øÏÂͼ±íʾÁËJVM
Óë¼ÆËã»úÓ²¼þ·ÖÅäµÄ¹Øϵ£º
ÎÄÕ¶¼¿´ÁË´ó°ëÁË»¹Ã»µ½volatile
£¿±ð¼±±ð¼±£¬ÏÈÀ´¿´¿´²¢·¢±à³ÌÖеÄÈý¸öÖØÒªÌØÐÔ£¬Õâ¶ÔÕýÈ·Àí½âvolatile
ÓкܴóµÄ°ïÖú¡£
Ô×ÓÐÔ¾ÍÊÇÔÚÒ»´Î»ò¶à´Î²Ù×÷ÖУº
Ò»¸öµäÐ͵ÄÀý×Ó¾ÍÊÇÁ½¸öÈËתÕË£¬±ÈÈçAÏòBתÕË1000Ôª£¬ÄÇôÕâ°üº¬Á½¸ö»ù±¾µÄ²Ù×÷£º
ÕâÁ½¸ö²Ù×÷£¬ÒªÃ´¶¼³É¹¦£¬ÒªÃ´¶¼Ê§°Ü£¬Ò²¾ÍÊDz»ÄܳöÏÖAÕË»§¿Û³ý1000µ«ÊÇBÕË»§½ð¶î²»±äµÄÇé¿ö£¬Ò²²»ÄܳöÏÖAÕË»§½ð¶î²»±äBÕË»§Ôö¼Ó1000µÄÇé¿ö¡£
ÐèҪעÒâµÄÊÇÁ½¸öÔ×ÓÐÔ²Ù×÷½áºÏÔÚÒ»Æðδ±ØÊÇÔ×ÓÐԵģ¬±ÈÈçi++
¡£±¾ÖÊÉÏÀ´Ëµ£¬i++
Éæ¼°µ½ÁËÈý¸ö²Ù×÷£º
get i
i+1
set i
ÕâÈý¸ö²Ù×÷¶¼ÊÇÔ×ÓÐԵģ¬µ«ÊÇ×éºÏÔÚÒ»Æð£¨i++
£©¾Í²»ÊÇÔ×ÓÐԵġ£
ÁíÒ»¸öÖØÒªµÄÌØÐÔÊǿɼûÐÔ£¬¿É¼ûÐÔÊÇÖ¸£¬Ò»¸öÏ̶߳Թ²Ïí±äÁ¿½øÐÐÁËÐ޸ģ¬ÄÇôÁíÍâµÄÏ߳̿ÉÒÔÁ¢¼´¿´µ½Ð޸ĺóµÄ×îÐÂÖµ¡£
Ò»¸ö¼òµ¥µÄÀý×ÓÈçÏ£º
public class Main {
private int x = 0;
private static final int MAX = 100000;
public static void main(String[] args) throws InterruptedException {
Main m = new Main();
Thread thread0 = new Thread(()->{
while(m.x < MAX) {
++m.x;
}
});
Thread thread1 = new Thread(()->{
while(m.x < MAX){
}
System.out.println("finish");
});
thread1.start();
TimeUnit.MILLISECONDS.sleep(1);
thread0.start();
}
}
Ïß³Ìthread1
»áÒ»Ö±ÔËÐУ¬ÒòΪthread1
°Ñx
¶ÁÈ빤×÷ÄÚ´æºó£¬»áÒ»Ö±ÅжϹ¤×÷ÄÚ´æÖеÄÖµ£¬ÓÉÓÚthread0
¸Ä±äµÄÊÇthread0
¹¤×÷ÄÚ´æµÄÖµ£¬²¢Ã»ÓжÔthread1
¿É¼û£¬Òò´ËÓÀÔ¶Ò²²»»áÊä³öfinish
£¬Ê¹ÓÃjstack
Ò²¿ÉÒÔ¿´µ½½á¹û£º
ÓÐÐòÐÔÊÇÖ¸´úÂëÔÚÖ´Ðйý³ÌÖеÄÏȺó˳Ðò£¬ÓÉÓÚJVM
µÄÓÅ»¯£¬µ¼ÖÂÁË´úÂëµÄ±àд˳Ðòδ±ØÊÇ´úÂëµÄÔËÐÐ˳Ðò£¬±ÈÈçÏÂÃæµÄËÄÌõÓï¾ä£º
int x = 10;
int y = 0;
x++;
y = 20;
ÓпÉÄÜy=20
ÔÚx++
Ç°Ö´ÐУ¬Õâ¾ÍÊÇÖ¸ÁîÖØÅÅÐò¡£Ò»°ãÀ´Ëµ£¬´¦ÀíÆ÷ΪÁËÌá¸ß³ÌÐòµÄЧÂÊ£¬¿ÉÄÜ»á¶ÔÊäÈëµÄ´úÂëÖ¸Áî×öÒ»¶¨µÄÓÅ»¯£¬²»»áÑϸñ°´ÕÕ±àд˳ÐòÈ¥Ö´ÐдúÂ룬µ«¿ÉÒÔ±£Ö¤×îÖÕÔËËã½á¹ûÊDZàÂëʱµÄÆÚÍû½á¹û£¬µ±È»£¬ÖØÅÅÐòÒ²ÓÐÒ»¶¨µÄ¹æÔò£¬ÐèÒªÑϸñ×ñÊØÖ¸ÁîÖ®¼äµÄÊý¾ÝÒÀÀµ¹Øϵ£¬²¢²»ÊÇ¿ÉÒÔÈÎÒâÖØÅÅÐò£¬±ÈÈ磺
int x = 10;
int y = 0;
x++;
y = x+1;
y=x+1
¾Í²»ÄÜÏÈÓÅÓÚx++
Ö´ÐС£
ÔÚµ¥Ïß³ÌÏÂÖØÅÅÐò²»»áµ¼ÖÂÔ¤ÆÚÖµµÄ¸Ä±ä£¬µ«ÔÚ¶àÏß³ÌÏ£¬Èç¹ûÓÐÐòÐԵò»µ½±£Ö¤£¬ÄÇô½«¿ÉÄܳöÏֺܴóµÄÎÊÌ⣺
private boolean initialized = false;
private Context context;
public Context load(){
if(!initialized){
context = loadContext();
initialized = true;
}
return context;
}
Èç¹û·¢ÉúÁËÖØÅÅÐò£¬initialized=true
ÅÅÐòµ½ÁËcontext=loadContext()
µÄÇ°Ã棬¼ÙÉèÁ½¸öÏß³ÌA¡¢Bͬʱ·ÃÎÊ£¬ÇÒloadContext()
ÐèÒªÒ»¶¨ºÄʱ£¬ÄÇô£º
true
£¬ÔÙ½øÐÐloadContext()
²Ù×÷true
£¬»áÖ±½Ó·µ»ØÒ»¸öδ¼ÓÔØÍê³ÉµÄcontext
volatile
ºÃÁËÖÕÓÚµ½ÁËvolatile
ÁË£¬Ç°Ãæ˵ÁËÕâô¶à£¬Ä¿µÄ¾ÍÊÇΪÁËÄܳ¹µ×Àí½âºÍÃ÷°×volatile
¡£Õⲿ·Ö·ÖΪËĸöС½Ú£º
volatile
µÄÓïÒåsynchronized
Çø±ðÏÈÀ´½éÉÜÒ»ÏÂvolatile
µÄÓïÒå¡£
±»volatile
ÐÞÊεÄʵÀý±äÁ¿»òÕßÀà±äÁ¿¾ßÓÐÁ½²ãÓïÒ壺
ÏÈ˵½áÂÛ£º
volatile
Äܱ£Ö¤¿É¼ûÐÔvolatile
Äܱ£Ö¤ÓÐÐòÐÔvolatile
²»Äܱ£Ö¤Ô×ÓÐÔÏÂÃæ·Ö±ð½øÐнéÉÜ¡£
Java
Öб£Ö¤¿É¼ûÐÔÓÐÈçÏ·½Ê½£º
volatile
£ºµ±Ò»¸ö±äÁ¿±»volatile
ÐÞÊÎʱ£¬¶Ô¹²Ïí×ÊÔ´µÄ¶Á²Ù×÷»áÖ±½ÓÔÚÖ÷ÄÚ´æÖнøÐУ¨×¼È·À´ËµÒ²»á¶ÁÈ¡µ½¹¤×÷ÄÚ´æÖУ¬µ«ÊÇÈç¹ûÆäËûÏ߳̽øÐÐÁËÐ޸ľͱØÐë´ÓÖ÷ÄÚ´æÖØжÁÈ¡£©£¬Ð´²Ù×÷ÊÇÏÈÐ޸Ť×÷Äڴ棬µ«ÊÇÐ޸ĽáÊøºóÁ¢¼´Ë¢Ðµ½Ö÷ÄÚ´æÖÐsynchronized
£ºsynchronized
Ò»ÑùÄܱ£Ö¤¿É¼ûÐÔ£¬Äܹ»±£Ö¤Í¬Ò»Ê±¿ÌÖ»ÓÐÒ»¸öÏ̻߳ñÈ¡µ½Ëø£¬È»ºóÖ´ÐÐͬ²½·½·¨£¬²¢ÇÒÈ·±£ËøÊÍ·Å֮ǰ£¬±äÁ¿µÄÐ޸ı»Ë¢Ðµ½Ö÷ÄÚ´æÖÐLock
£ºLock
µÄlock
·½·¨Äܱ£Ö¤Í¬Ò»Ê±¿ÌÖ»ÓÐÒ»¸öÏß³ÌÄܹ»»ñÈ¡µ½ËøÈ»ºóÖ´ÐÐͬ²½·½·¨£¬²¢ÇÒÈ·±£ËøÊÍ·Å֮ǰÄܹ»½«¶Ô±äÁ¿µÄÐÞ¸Äˢе½Ö÷ÄÚ´æÖоßÌåÀ´Ëµ£¬¿ÉÒÔ¿´Ò»ÏÂ֮ǰµÄÀý×Ó£º
public class Main {
private int x = 0;
private static final int MAX = 100000;
public static void main(String[] args) throws InterruptedException {
Main m = new Main();
Thread thread0 = new Thread(()->{
while(m.x < MAX) {
++m.x;
}
});
Thread thread1 = new Thread(()->{
while(m.x < MAX){
}
System.out.println("finish");
});
thread1.start();
TimeUnit.MILLISECONDS.sleep(1);
thread0.start();
}
}
ÉÏÃæ˵¹ýÕâ¶Î´úÂë»á²»¶ÏÔËÐУ¬Ò»Ö±Ã»ÓÐÊä³ö£¬¾ÍÊÇÒòΪÐ޸ĺóµÄx
¶ÔÏß³Ìthread1
²»¿É¼û£¬Èç¹ûÔÚx
µÄ¶¨ÒåÖмÓÉÏÁËvolatile
£¬¾Í²»»á³öÏÖûÓÐÊä³öµÄÇé¿öÁË£¬ÒòΪ´Ëʱ¶Ôx
µÄÐÞ¸ÄÊÇÏß³Ìthread1
¿É¼ûµÄ¡£
JMM
ÖÐÔÊÐí±àÒëÆںʹ¦ÀíÆ÷¶ÔÖ¸Áî½øÐÐÖØÅÅÐò£¬ÔÚ¶àÏ̵߳ÄÇé¿öÏÂÓпÉÄÜ»á³öÏÖÎÊÌ⣬Ϊ´Ë£¬Java
ͬÑùÌṩÁËÈýÖÖ»úÖÆÈ¥±£Ö¤ÓÐÐòÐÔ£º
volatile
synchronized
Lock
ÁíÍ⣬¹ØÓÚÓÐÐòÐÔ²»µÃ²»ÌáµÄ¾ÍÊÇHappens-before
ÔÔò¡£Happends-before
ÔÔò˵µÄ¾ÍÊÇÈç¹ûÁ½¸ö²Ù×÷µÄÖ´ÐдÎÐòÎÞ·¨´Ó¸ÃÔÔòÍƵ¼³öÀ´£¬ÄÇô¾ÍÎÞ·¨±£Ö¤ÓÐÐòÐÔ£¬JVM
»ò´¦ÀíÆ÷¿ÉÒÔÈÎÒâÖØÅÅÐò¡£Õâô×öµÄÄ¿µÄÊÇΪÁ˾¡¿ÉÄÜÌá¸ß³ÌÐòµÄ²¢Ðжȣ¬¾ßÌå¹æÔòÈçÏ£º
unlock
²Ù×÷ÒªÏÈÐз¢ÉúÓÚ¶Ôͬһ¸öËøµÄlock
²Ù×÷volatile
±äÁ¿¹æÔò£º¶ÔÒ»¸ö±äÁ¿µÄд²Ù×÷ÒªÔçÓÚ¶ÔÕâ¸ö±äÁ¿Ö®ºóµÄ¶Á²Ù×÷Thread
¶ÔÏóµÄstart()
·½·¨ÏÈÐз¢ÉúÓÚ¶Ô¸ÃÏ̵߳ÄÈκζ¯×÷interrupt()
·½·¨¿Ï¶¨ÒªÓÅÓÚ²¶»ñµ½ÖжÏÐźţ¬»»¾ä»°Ëµ£¬Èç¹ûÊÕµ½ÁËÖжÏÐźţ¬ÄÇôÔÚ´Ë֮ǰ±Ø¶¨µ÷ÓÃÁËinterrupt()
finalize()
֮ǰ¶ÔÓÚvolatile
£¬»áÖ±½Ó½ûÖ¹¶ÔÖ¸ÁîÖØÅÅ£¬µ«ÊǶÔÓÚvolatile
Ç°ºóÎÞÒÀÀµ¹ØϵµÄÖ¸Áî¿ÉÒÔËæÒâÖØÅÅ£¬±ÈÈ磺
int x = 0;
int y = 1;
//private volatile int z;
z = 20;
x++;
y--;
ÔÚz=20
֮ǰ£¬Ïȶ¨Òåx
»òÏȶ¨Òåy
²¢Ã»ÓÐÒªÇó£¬Ö»ÐèÒªÔÚÖ´ÐÐz=20
µÄʱºò£¬¿ÉÒÔ±£Ö¤x=0,y=1
¼´¿É£¬Í¬Àí£¬x++
»òy--
¾ßÌåÏÈÖ´ÐÐÄÄÒ»¸ö²¢Ã»ÓÐÒªÇó£¬Ö»ÐèÒª±£Ö¤Á½ÕßÖ´ÐÐÔÚz=20
Ö®ºó¼´¿É¡£
ÔÚJava
ÖУ¬ËùÓжԻù±¾Êý¾ÝÀàÐͱäÁ¿µÄ¶ÁÈ¡¸³Öµ²Ù×÷¶¼ÊÇÔ×ÓÐԵģ¬¶ÔÒýÓÃÀàÐ͵ıäÁ¿¶ÁÈ¡ºÍ¸³ÖµÒ²ÊÇÔ×ÓÐԵģ¬µ«ÊÇ£º
i++
JMM
Ö»±£Ö¤»ù±¾¶ÁÈ¡ºÍ¸³ÖµµÄÔ×ÓÐÔ²Ù×÷£¬ÆäËûµÄ¾ù²»±£Ö¤£¬Èç¹ûÐèÒª¾ß±¸Ô×ÓÐÔ£¬ÄÇô¿ÉÒÔʹÓÃsynchronized
»òLock
£¬»òÕßJUC
°üϵÄÔ×Ó²Ù×÷ÀàÒ²¾ÍÊÇ˵£¬volatile
²¢²»Äܱ£Ö¤Ô×ÓÐÔ£¬Àý×ÓÈçÏ£º
public class Main {
private volatile int x = 0;
private static final CountDownLatch latch = new CountDownLatch(10);
public void inc() {
++x;
}
public static void main(String[] args) throws InterruptedException {
Main m = new Main();
IntStream.range(0, 10).forEach(i -> {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
m.inc();
}
latch.countDown();
}).start();
});
latch.await();
System.out.println(m.x);
}
}
×îºóÊä³öµÄx
µÄÖµ»áÉÙÓÚ10000
£¬¶øÇÒÿ´ÎÔËÐеĽá¹ûÒ²²¢²»Ïàͬ£¬ÖÁÓÚÔÒò£¬¿ÉÒÔ´ÓÁ½¸öÏß³ÌA¡¢B¿ªÊ¼·ÖÎö£¬Í¼Ê¾ÈçÏ£º
0-t1
£ºÏß³ÌA½«x
¶ÁÈ빤×÷Äڴ棬´Ëʱx=0
t1-t2
£ºÏß³ÌAʱ¼äƬÍ꣬CPU
µ÷¶ÈÏß³ÌB£¬Ïß³ÌB½«x
¶ÁÈ빤×÷Äڴ棬´Ëʱx=0
t2-t3
£ºÏß³ÌB¶Ô¹¤×÷ÄÚ´æÖеÄx
½øÐÐ×ÔÔö²Ù×÷£¬²¢¸üе½¹¤×÷ÄÚ´æÖÐt3-t4
£ºÏß³ÌBʱ¼äƬÍ꣬CPU
µ÷¶ÈÏß³ÌA£¬Í¬ÀíÏß³ÌA¶Ô¹¤×÷ÄÚ´æÖеÄx
×ÔÔöt4-t5
£ºÏß³ÌA½«¹¤×÷ÄÚ´æÖеÄֵд»ØÖ÷Äڴ棬´ËʱÖ÷ÄÚ´æÖеÄֵΪx=1
t5
ÒÔºó£ºÏß³ÌAʱ¼äƬÍ꣬CPU
µ÷¶ÈÏß³ÌB£¬Ïß³ÌBÒ²½«×Ô¼ºµÄ¹¤×÷ÄÚ´æд»ØÖ÷Äڴ棬Ôٴν«Ö÷ÄÚ´æÖеÄx
¸³ÖµÎª1Ò²¾ÍÊÇ˵£¬¶àÏ̲߳Ù×÷µÄ»°£¬»á³öÏÖÁ½´Î×ÔÔöµ«ÊÇʵ¼ÊÉÏÖ»½øÐÐÒ»´ÎÊýÖµÐ޸ĵIJÙ×÷¡£ÏëÒªx
µÄÖµ±äΪ10000
Ò²ºÜ¼òµ¥£¬¼ÓÉÏsynchronized
¼´¿É£º
new Thread(() -> {
synchronized (m) {
for (int j = 0; j < 1000; j++) {
m.inc();
}
}
latch.countDown();
}).start();
Ç°ÃæÒѾ֪µÀ£¬volatile
¿ÉÒÔ±£Ö¤ÓÐÐòÐÔÒÔ¼°¿É¼ûÐÔ£¬ÄÇô£¬¾ßÌåÊÇÈçºÎ²Ù×÷µÄÄØ£¿
´ð°¸¾ÍÊÇÒ»¸ölock;
ǰ׺£¬¸Ãǰ׺ʵ¼ÊÉÏÏ൱ÓÚÒ»¸öÄÚ´æÆÁÕÏ£¬¸ÃÄÚ´æÆÁÕÏ»áΪָÁîµÄÖ´ÐÐÌṩÈçϼ¸¸ö±£ÕÏ£º
Ò»¸öµäÐ͵ÄʹÓó¡¾°ÊÇÀûÓÿª¹Ø½øÐÐÏ̵߳ĹرղÙ×÷£¬Àý×ÓÈçÏ£º
public class ThreadTest extends Thread{
private volatile boolean started = true;
@Override
public void run() {
while (started){
}
}
public void shutdown(){
this.started = false;
}
}
Èç¹û²¼¶û±äÁ¿Ã»Óб»volatile
ÐÞÊΣ¬ÄÇôºÜ¿ÉÄÜеIJ¼¶ûֵˢв»µ½Ö÷ÄÚ´æÖУ¬µ¼ÖÂÏ̲߳»»á½áÊø¡£
synchronized
µÄÇø±ðvolatile
Ö»ÄÜÓÃÓÚÐÞÊÎʵÀý±äÁ¿»òÕßÀà±äÁ¿£¬µ«ÊDz»ÄÜÓÃÓÚÐÞÊη½·¨¡¢·½·¨²ÎÊý¡¢¾Ö²¿±äÁ¿µÈ£¬ÁíÍâ¿ÉÒÔÐÞÊεıäÁ¿Îªnull
¡£µ«synchronized
²»ÄÜÓÃÓÚ¶Ô±äÁ¿µÄÐÞÊΣ¬Ö»ÄÜÐÞÊη½·¨»òÓï¾ä¿é£¬¶øÇÒmonitor
¶ÔÏó²»ÄÜΪnull
volatile
ÎÞ·¨±£Ö¤Ô×ÓÐÔ£¬µ«ÊÇsynchronized
¿ÉÒÔ±£Ö¤volatile
Óësynchronized
¶¼Äܱ£Ö¤¿É¼ûÐÔ£¬µ«ÊÇsynchronized
ÊǽèÖúÓÚJVM
Ö¸Áîmonitor enter
/monitor exit
±£Ö¤µÄ£¬ÔÚmonitor exit
µÄʱºòËùÓй²Ïí×ÊÔ´¶¼±»Ë¢Ðµ½Ö÷ÄÚ´æÖУ¬¶øvolatile
ÊÇͨ¹ýlock;
»úÆ÷Ö¸ÁîʵÏֵģ¬ÆÈʹÆäËûÏ̹߳¤×÷ÄÚ´æʧЧ£¬ÐèÒªµ½Ö÷ÄÚ´æ¼ÓÔØvolatile
Äܹ»½ûÖ¹JVM
ÒÔ¼°´¦ÀíÆ÷¶ÔÆä½øÐÐÖØÅÅÐò£¬¶øsynchronized
±£Ö¤µÄÓÐÐòÐÔÊÇͨ¹ý³ÌÐò´®Ðл¯Ö´Ðл»À´µÄ£¬²¢ÇÒÔÚsynchronized
´úÂë¿éÖеĴúÂëÒ²»á·¢ÉúÖ¸ÁîÖØÅŵÄÇé¿övolatile
²»»áʹÏß³ÌÏÝÈë×èÈû£¬µ«synchronized
»ámacromedia dreamweaver 8ÐòÁкŠ¼¤»îÂ룺 wpd800-50438-28032-39991 wpd800-599...
Do not use these html elements in html pages. Presentational elements shoul...
1¡¢Ê¹ÓÃcss¾«Áé¡£ ºÃ´¦Êǽ«cssÖÐʹÓõÄСͼƬ¿ÉÒԺϲ¢ÎªÒ»ÕÅ´óͼƬ¼õÉÙÁ˶ԷþÎñ...
Ëæ×ÅÍøÂçʱ´úµÄ·¢Õ¹Óë½ø²½£¬ÎÒÃǵÄѧϰ¹¤×÷ºÍÉú»îÔçÒÑÀë²»¿ª»¥ÁªÍø£¬ÖÇÄܼҾӡ¢...
DreamweaverÍøÒ³ÖеÄbannerͼƬÐèÒªÇл»£¬ÎÒÃÇ¿ÉÒÔÌí¼Ó°´Å¥À´Çл»Í¼Æ¬£¬ÏÂÃæÎÒÃÇ...
ÕâÊÇÒ»¿î»ùÓÚHTML5ºÍJavaScriptµÄ½ø¶ÈÌõÓ¦Óã¬Õâ¿î½ø¶ÈÌõ²å¼þ·Ç³£ÓÐÌص㣬ËüÔÚ½ø...
»¹¼ÇµÃÎÒÔÚ¡¶2020 Äê JavaScript ״̬µ÷Ñб¨¸æС½á¡·ÖÐÌáµ½µÄ 2020 ÄêÈ«Çò¿ª·¢Õß...
windows ÏÂĬÈϵĹö¶¯ÌõÑùʽ¾Þ³ó£¬ÏîÄ¿ÖÐÓÖÓбȽ϶àµØ·½»áÏÔʾ¹ö¶¯Ìõ£¬ ¹Ê»ØÍ··...
dreamweaverÈí¼þ£º µã´ËÏÂÔØ 1¡¢ÊìϤÍøÒ³Éè¼ÆµÄÍøÓѾÍÖªµÀ£¬µ÷ÓÃSTYLEµÄ·½·¨ºÜ¶à...
ÔÚ¿ª·¢ÖУ¬Èç¹ûÓöµ½ÐèҪʹÓÃcanvasͬʱ»æÖƶàÕÅͼƬ£¬µ«ÒòΪͼƬ´óСµÄ²»Ò»Ñù£¬...