¸üÐÂʱ¼ä:2023Äê03ÔÂ28ÈÕ13ʱ56·Ö À´Ô´:ÀÖÓãµç¾º ä¯ÀÀ´ÎÊý:

¡¡¡¡ËøÏû³ýºÍËø´Ö»¯ÊÇÁ½ÖÖÓÅ»¯¼¼Êõ£¬ÓÃÓÚÌá¸ß¶àÏ̳߳ÌÐòµÄÐÔÄÜ¡£
¡¡¡¡ËøÏû³ý(Lock Elimination)ÊÇÖ¸ÔÚ±àÒëÆ÷»òÕßÔËÐÐʱ»·¾³ÖУ¬¶ÔÓÚÄ³Ð©ÌØ¶¨µÄ´úÂëÆ¬¶Î£¬Èç¹û¿ÉÒÔÈ·¶¨²»»á·¢Éú²¢·¢³åÍ»£¬¾Í¿ÉÒÔÊ¡ÂÔµô¶ÔÓ¦µÄËø²Ù×÷£¬´Ó¶øÌá¸ß³ÌÐòµÄÔËÐÐЧÂÊ¡£
¡¡¡¡Ëø´Ö»¯(Lock Coarsening)ÊÇÖ¸ÔÚ±àÒëÆ÷»òÕßÔËÐÐʱ»·¾³ÖУ¬¶ÔÓÚÁ¬ÐøµÄ¶à¸öËø²Ù×÷£¬½«ÆäºÏ²¢³ÉÒ»¸öËø²Ù×÷£¬´Ó¶ø¼õÉÙËøµÄÁ£¶È£¬Ìá¸ß³ÌÐòµÄÔËÐÐЧÂÊ¡£
¡¡¡¡ÏÂÃæÊÇÁ½¸ö¼òµ¥µÄʾÀý£º
public class LockEliminationDemo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000; i++) {
sb.append(i);
}
System.out.println(sb.toString());
}
}
¡¡¡¡ÔÚÕâ¸öʾÀýÖУ¬ÓÉÓÚ StringBuilder µÄÄÚ²¿ÊµÏÖ²¢²»ÊÇḬ̈߳²È«µÄ£¬ËùÒÔÔÚ¶àÏ̻߳·¾³Ï±ØÐëʹÓÃËøÀ´±£Ö¤²Ù×÷µÄÕýÈ·ÐÔ¡£µ«ÊÇ£¬ÓÉÓÚÔÚÕâ¸ö³ÌÐòÖÐÖ»ÓÐÒ»¸öÏß³Ì¶Ô StringBuilder ½øÐÐÁ˲Ù×÷£¬Òò´Ë±àÒëÆ÷¿ÉÒÔͨ¹ýÊý¾ÝÁ÷·ÖÎö¼¼ÊõÅжϳö²»´æÔÚ²¢·¢³åÍ»£¬´Ó¶ø½«¶ÔÓ¦µÄËø²Ù×÷Ïû³ýµô£¬´Ó¶øÌá¸ß³ÌÐòµÄÔËÐÐЧÂÊ¡£
public class LockCoarseningDemo {
public static void main(String[] args) {
Object lock = new Object();
for (int i = 0; i < 1000000; i++) {
synchronized (lock) {
doSomething(i);
}
}
}
private static void doSomething(int i) {
// do something
}
}
¡¡¡¡ÔÚÕâ¸öʾÀýÖУ¬ÓÉÓÚ synchronized ¿éµÄÁ£¶È·Ç³£Ð¡£¬Ã¿´ÎÖ»°üº¬ÁËÒ»¸ö·½·¨µ÷Óã¬Òò´Ë»áµ¼Ö´óÁ¿µÄËø²Ù×÷£¬´Ó¶ø½µµÍ³ÌÐòµÄÔËÐÐЧÂÊ¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿ö£¬±àÒëÆ÷¿ÉÒÔ½«Á¬ÐøµÄ¶à¸ö synchronized ¿éºÏ²¢³ÉÒ»¸ö¸ü´óµÄ synchronized ¿é£¬´Ó¶ø¼õÉÙËøµÄÁ£¶È£¬Ìá¸ß³ÌÐòµÄÔËÐÐЧÂÊ¡£ÀýÈ磬¿ÉÒÔ½«ÉÏÊöʾÀýÖÐµÄ synchronized ¿é¸ÄΪÈçÏÂÐÎʽ£º
public class LockCoarseningDemo {
public static void main(String[] args) {
Object lock = new Object();
synchronized (lock) {
for (int i = 0; i < 1000000; i++) {
doSomething(i);
}
}
}
private static void doSomething(int i) {
// do something
}
}
¡¡¡¡¶ÔÓÚËøÏû³ý£¬ËüµÄÔÀíÊÇͨ¹ý¶Ô³ÌÐòµÄ´úÂë½øÐÐÊý¾ÝÁ÷·ÖÎö£¬ÅжϳöÔÚijЩÇé¿öϲ»´æÔÚ²¢·¢³åÍ»£¬´Ó¶øÊ¡ÂÔ¶ÔÓ¦µÄËø²Ù×÷¡£ÕâÖÖÓÅ»¯¼¼ÊõÖ÷ÒªÊÊÓÃÓÚ¾Ö²¿±äÁ¿»òÕß·½·¨²ÎÊýµÈ·¶Î§½ÏСµÄ¶ÔÏó£¬ÒòΪÕâЩ¶ÔÏóÔÚ¶àÏ̻߳·¾³ÏµÄʹÓñȽÏÈÝÒ×·ÖÎö¡£ÀýÈçÔÚÉÏÃæµÄʾÀýÖУ¬StringBuilder ¶ÔÏóµÄʹÓ÷¶Î§½ÏС£¬Òò´Ë±àÒëÆ÷¿ÉÒÔºÜÈÝÒ׵طÖÎö³ö²»´æÔÚ²¢·¢³åÍ»¡£
¡¡¡¡¶ÔÓÚËø´Ö»¯£¬ËüµÄÔÀíÊÇͨ¹ý½«¶à¸öÁ¬ÐøµÄËø²Ù×÷ºÏ²¢³ÉÒ»¸ö¸ü´óµÄËø²Ù×÷£¬´Ó¶ø¼õÉÙËøµÄÁ£¶È¡£ÕâÖÖÓÅ»¯¼¼ÊõÖ÷ÒªÊÊÓÃÓÚÐèÒª¶Ôͬһ¸ö¶ÔÏó½øÐжà´ÎÁ¬ÐøµÄËø²Ù×÷µÄÇé¿ö¡£ÀýÈçÔÚÉÏÃæµÄʾÀýÖУ¬ÓÉÓÚÿ´ÎÑ»·¶¼ÐèÒª¶Ôͬһ¸ö¶ÔÏó½øÐÐËø²Ù×÷£¬Òò´Ë±àÒëÆ÷¿ÉÒÔ½«ÕâÐ©Ëø²Ù×÷ºÏ²¢³ÉÒ»¸ö¸ü´óµÄËø²Ù×÷£¬´Ó¶ø¼õÉÙËøµÄÁ£¶È¡£
¡¡¡¡ÐèҪעÒâµÄÊÇ£¬ËøÏû³ýºÍËø´Ö»¯¶¼ÊDZàÒëÆ÷»òÕßÔËÐÐʱ»·¾³×Ô¶¯½øÐеÄÓÅ»¯¼¼Êõ£¬²»ÐèÒªÊÖ¶¯½øÐдúÂëµÄÐ޸ġ£µ«ÊÇ£¬ÔÚÒ»Ð©ÌØÊâÇé¿öÏ£¬ÕâЩÓÅ»¯¼¼Êõ¿ÉÄܻᵼÖ³ÌÐòµÄÕýÈ·ÐÔÊܵ½Ó°Ï죬Òò´ËÔÚ½øÐÐÐÔÄÜÓÅ»¯Ê±ÐèÒª½÷É÷ʹÓá£
±±¾©Ð£Çø