¾ÅÓΡ¤»á(J9.com)¹Ù·½ÍøÕ¾-ÕæÈËÓÎÏ·µÚÒ»Æ·ÅÆ

    ¸ÓÖÝÏÍÎĿƼ¼
    ¿Í·þÈÈÏß400-8609-529
    ±ùÏäάÐÞ

    javaÖеÄËøÔõôʵÏÖ

    ×÷Õߣºadmin111    ·¢²¼Ê±¼ä£º2024-09-20 10:12:53    ä¯ÀÀÁ¿£º

    Ò»¡¢ËøµÄ¸ÅÄîÓë×÷ÓÃ

    javaÖеÄËøÔõôʵÏÖ

    1. ËøµÄ¸ÅÄî

    - ËøÊÇÒ»ÖÖͬ²½»úÖÆ£¬ÓÃÓÚ¿ØÖƶԹ²Ïí×ÊÔ´µÄ·ÃÎÊ£¬È·±£Í¬Ò»Ê±¿ÌÖ»ÓÐÒ»¸öÏ߳̿ÉÒÔ²Ù×÷¹²Ïí×ÊÔ´¡£

    - ÔÚJavaÖУ¬ËøÓÃÓÚ½â¾ö¶àÏ̲߳¢·¢Ê±¿ÉÄܳöÏֵľºÕùÌõ¼þÎÊÌ⣬ȷ±£Ḭ̈߳²È«¡£

    2. ËøµÄ×÷ÓÃ

    - ±ÜÃâÊý¾Ý²»Ò»Ö£ºÔÚ¶àÏ̻߳·¾³Ï£¬¶à¸öÏ߳̿ÉÄÜͬʱÐÞ¸ÄͬһÊý¾Ý£¬Ê¹ÓÃËø¿ÉÒÔ±ÜÃâÕâÖÖÇé¿öÏÂÊý¾ÝµÄ²»Ò»Ö¡£

    - ·ÀÖ¹ËÀËø£ºËÀËøÊÇÖ¸¶à¸öÏß³ÌÒòΪ»¥ÏàµÈ´ý¶Ô·½ÊÍ·ÅËø¶øÎÞ·¨¼ÌÐøÖ´ÐеÄ״̬¡£Í¨¹ýºÏÀíʹÓÃËø£¬¿ÉÒÔ½µµÍËÀËø·¢ÉúµÄ¸ÅÂÊ¡£

    - Ìá¸ß³ÌÐòÐÔÄÜ£ººÏÀíʹÓÃËø¿ÉÒÔÌá¸ß³ÌÐòÔÚ¶àÏ̻߳·¾³ÏµÄÐÔÄÜ£¬¼õÉÙ×ÊÔ´¾ºÕù´øÀ´µÄ¿ªÏú¡£

    3. ¾ßÌå°¸Àý

    - ÀýÈ磬ÔÚʵÏÖÉú²úÕß-Ïû·ÑÕßģʽʱ£¬Ê¹ÓÃËøÀ´±£Ö¤Éú²úÕߺÍÏû·ÑÕßÖ®¼äµÄͬ²½£¬·ÀÖ¹Éú²úÕßÔÚ»º³åÇøÂúʱ¼ÌÐøÉú²ú£¬»òÕßÏû·ÑÕßÔÚ»º³åÇø¿Õʱ¼ÌÐøÏû·Ñ¡£

    - ÔÚ¶àÏ̻߳·¾³Ï£¬¶Ô¹²ÏíÊý¾Ý½á¹¹ÈçArrayList¡¢HashMapµÈ½øÐвÙ×÷ʱ£¬Ê¹ÓÃËøÀ´È·±£Ḭ̈߳²È«£¬·ÀÖ¹³öÏÖÊý¾Ý²»Ò»ÖµÄÇé¿ö¡£

    4. ×¢ÒâÊÂÏî

    - ʹÓÃËøÊ±£¬ÐèÒª×ñÑ­¡°ÏÈ»ñÈ¡Ëø£¬ºó²Ù×÷×ÊÔ´£¬×îºóÊÍ·ÅËø¡±µÄÔ­Ôò¡£

    - ÔÚʹÓÃËøµÄ¹ý³ÌÖУ¬Òª¾¡Á¿±ÜÃⳤʱ¼ä³ÖÓÐËø£¬ÒÔ¼õÉÙÆäËûÏ̵߳ĵȴýʱ¼ä¡£

    - ÔÚÉè¼ÆËøÊ±£¬Òª¿¼ÂÇËøµÄÁ£¶È£¬ºÏÀíÑ¡ÔñËøµÄÀàÐÍ£¬ÒÔÌá¸ß³ÌÐòµÄÐÔÄÜ¡£

    ¶þ¡¢JavaÖеÄËø·ÖÀà

    javaÖеÄËøÔõôʵÏÖ

    1. ÄÚÖÃËø£¨Intrinsic Lock£©

    - Ò²³ÆÎª¼àÊÓÆ÷Ëø£¨Monitor Lock£©£¬Í¨¹ýsynchronized¹Ø¼ü×ÖʵÏÖ¡£

    - ÀýÈ磺synchronized·½·¨»òsynchronized´úÂë¿é¡£

    2. ÖØÈëËø£¨ReentrantLock£©

    - ÌṩÁËÒ»ÖÖÏÔʽµÄËø»úÖÆ£¬±ÈÄÚÖÃËø¹¦Äܸü·á¸»¡£

    - Æ·ÅÆÊµÀý£ºJava.util.concurrent.locks.ReentrantLock¡£

    3. ¶ÁÐ´Ëø£¨ReadWriteLock£©

    - ÊÊÓÃÓÚ¶Á¶àдÉٵij¡¾°£¬·ÖΪ¶ÁËø£¨¹²ÏíËø£©ºÍÐ´Ëø£¨ÅÅËûËø£©¡£

    - Æ·ÅÆÊµÀý£ºJava.util.concurrent.locks.ReentrantReadWriteLock¡£

    4. Ìõ¼þËø£¨Condition£©

    - ÓëReentrantLock½áºÏʹÓã¬ÓÃÓÚÏ̼߳äµÄÌõ¼þµÈ´ýºÍ֪ͨ¡£

    - Æ·ÅÆÊµÀý£ºJava.util.concurrent.locks.Condition¡£

    5. ÀÖ¹ÛËø£¨Optimistic Locking£©

    - ͨ¹ýCAS£¨Compare And Swap£©²Ù×÷ʵÏÖ£¬ÊÊÓÃÓÚ³åÍ»·¢Éú¸ÅÂʽϵ͵ij¡¾°¡£

    - Æ·ÅÆÊµÀý£ºJava.util.concurrent.atomic°üϵÄÀ࣬ÈçAtomicInteger¡£

    6. Æ«ÏòËø£¨Biased Locking£©

    - ÓÅ»¯ËøµÄ³·Ïú²Ù×÷£¬¼ÙÉèËøÖ÷Òª±»Ò»¸öÏ̳߳ÖÓС£

    - ÎÞ¾ßÌ寷ů£¬ÊÇJavaÐéÄâ»ú£¨JVM£©µÄÒ»ÖÖËøÓÅ»¯²ßÂÔ¡£

    7. ÇáÁ¿¼¶Ëø£¨Lightweight Locking£©

    - ÊÊÓÃÓÚËø¾ºÕù²»¼¤ÁÒ£¬ÇÒ³ÖËøÊ±¼ä¶ÌµÄ³¡¾°¡£

    - ÎÞ¾ßÌ寷ů£¬Í¬ÑùÊÇJVMµÄÒ»ÖÖËøÓÅ»¯²ßÂÔ¡£

    8. ×ÔÐýËø£¨Spin Lock£©

    - Ïß³ÌÔÚ»ñÈ¡ËøÊ±²»»áÁ¢¼´×èÈû£¬¶øÊÇÑ­»·¼ì²éËøÊÇ·ñ¿ÉÓá£

    - ÎÞ¾ßÌ寷ů£¬ÊÇËøµÄÒ»ÖÖʵÏÖ·½Ê½¡£

    ×¢ÒâÊÂÏ

    - ÔÚÑ¡ÔñËøÀàÐÍʱ£¬Ó¦¸ù¾Ý¾ßÌ峡¾°ºÍÐèÇóÀ´¾ö¶¨£¬ÀýÈçÔڸ߲¢·¢³¡¾°Ï£¬¶ÁÐ´Ëø¿ÉÄܱÈÄÚÖÃËø¸ü¸ßЧ¡£

    - ʹÓÃReentrantLockʱ£¬¿ÉÒÔÁé»îµØÊµÏÖ¹«Æ½ËøºÍ·Ç¹«Æ½Ëø¡£

    - ÀÖ¹ÛËøºÍ±¯¹ÛËøµÄÑ¡Ôñ£¬Ó¦»ùÓÚ³åÍ»·¢ÉúµÄ¸ÅÂʺͶÔÐÔÄܵÄÒªÇó¡£

    - Á˽ⲢʹÓÃJVMµÄËøÓÅ»¯²ßÂÔ£¬ÈçÆ«ÏòËøºÍÇáÁ¿¼¶Ëø£¬¿ÉÒÔÔÚijЩ³¡¾°ÏÂÌá¸ß³ÌÐòÐÔÄÜ¡£

    Èý¡¢ÄÚÖÃËø£¨Intrinsic Lock£©ÊµÏÖ

    javaÖеÄËøÔõôʵÏÖ

    1. ¸ÅÊö

    - ÄÚÖÃËøÊÇJavaÓïÑÔÖÐÌṩµÄÒ»ÖÖËø»úÖÆ£¬Ò²³ÆÎª¼àÊÓÆ÷Ëø£¨Monitor Lock£©¡£ËüÊÇͨ¹ý`synchronized`¹Ø¼ü×ÖʵÏֵģ¬Ã¿¸öJava¶ÔÏ󶼿ÉÒÔ×÷ÎªËø¡£

    2. ʵÏÖ·½Ê½

    - ʹÓÃ`synchronized`·½·¨£º½«·½·¨ÉùÃ÷Ϊ`synchronized`£¬µ±Ò»¸öÏ̷߳ÃÎʸ÷½·¨Ê±£¬Ëü»á×Ô¶¯»ñÈ¡¶ÔÏóµÄËø£¬ÆäËûÏ߳̽«ÎÞ·¨Í¬Ê±·ÃÎʸ÷½·¨¡£

    - ʹÓÃ`synchronized`´úÂë¿é£º½«´úÂë¿éÓÃ`synchronized`¹Ø¼ü×Ö°üΧ£¬²¢Ö¸¶¨Ò»¸öËø¶ÔÏó¡£Ï߳̽øÈë´úÂë¿éǰ±ØÐë»ñȡָ¶¨Ëø¶ÔÏóµÄËø¡£

    3. ¾ßÌå°¸Àý

    - **°¸ÀýÒ»£ºÍ¬²½·½·¨**

    ```java

    public class Counter {

    private int count = 0;

    public synchronized void increment() {

    count++;

    }

    }

    ```

    ÔÚÕâ¸öÀý×ÓÖУ¬`increment`·½·¨±»ÉùÃ÷Ϊ`synchronized`£¬µ±¶à¸öÏ̵߳÷Óø÷½·¨Ê±£¬ËüÃÇ»áÒÀ´Î»ñÈ¡`Counter`¶ÔÏóµÄËø£¬´Ó¶ø±£Ö¤`count`±äÁ¿µÄḬ̈߳²È«¡£

    - **°¸Àý¶þ£ºÍ¬²½´úÂë¿é**

    ```java

    public class Counter {

    private int count = 0;

    private final Object lock = new Object();

    public void increment() {

    synchronized (lock) {

    count++;

    }

    }

    }

    ```

    ÔÚÕâ¸öÀý×ÓÖУ¬`increment`·½·¨Öаüº¬Ò»¸öͬ²½´úÂë¿é£¬Ê¹ÓÃ`lock`¶ÔÏó×÷ÎªËø¡£Ïß³ÌÔÚÖ´ÐÐ`count++`֮ǰ±ØÐë»ñÈ¡`lock`¶ÔÏóµÄËø¡£

    4. ×¢ÒâÊÂÏî

    - ±ÜÃâÔÚ`synchronized`·½·¨»ò´úÂë¿éÖÐʹÓùý¶àµÄÂß¼­£¬ÒòΪÕâ»áµ¼ÖÂËø±»³ÖÓÐʱ¼ä¹ý³¤£¬Ó°Ïì³ÌÐòÐÔÄÜ¡£

    - ±ÜÃâÔÚ`synchronized`·½·¨»ò´úÂë¿éÖе÷ÓÃÆäËû·½·¨£¬ÓÈÆäÊÇ¿ÉÄÜÅ׳öÒì³£µÄ·½·¨£¬ÒòΪÕâ¿ÉÄܵ¼ÖÂËøÎÞ·¨Õý³£ÊÍ·Å¡£

    - ÔÚʹÓÃ`synchronized`´úÂë¿éʱ£¬Ñ¡ÔñºÏÊʵÄËø¶ÔÏóÖÁ¹ØÖØÒª¡£Èç¹ûËø¶ÔÏó·¶Î§¹ý´ó£¬¿ÉÄܻᵼÖ²»±ØÒªµÄÏ̵߳ȴý¡£

    5. ³£¼ûÆ·ÅÆ£¨´Ë´¦Ö¸´úJavaÖеÄËø»úÖÆ£©

    - `synchronized`¹Ø¼ü×Ö£ºJavaÌṩµÄÄÚÖÃËø»úÖÆ¡£

    - `ReentrantLock`£ºÏÔÊ½ËøµÄÒ»ÖÖ£¬ÌṩÁ˱È`synchronized`¸ü·á¸»µÄ¹¦ÄÜ£¬Èç¿ÉÖжϵÄËø»ñÈ¡¡¢¹«Æ½ËøµÈÌØÐÔ¡£

    - `ReadWriteLock`£ºÓÃÓÚ¶ÁÐ´Ëø·ÖÀ룬Ìá¸ß¶Á²Ù×÷µÄ²¢·¢ÐÔÄÜ¡£

    - `Condition`£ºÓë`ReentrantLock`½áºÏʹÓã¬ÌṩÀàËÆ`Object.wait()`ºÍ`Object.notify()`µÄ¹¦ÄÜ¡£

    ËÄ¡¢ÏÔÊ½Ëø£¨Explicit Lock£©ÊµÏÖ

    javaÖеÄËøÔõôʵÏÖ

    1. ÏÔÊ½Ëø¸ÅÊö

    - ÏÔÊ½ËøÊÇָͨ¹ýJavaµÄ`Lock`½Ó¿Ú¼°ÆäʵÏÖÀàÀ´ÏÔʽ¹ÜÀíµÄËø¡£ÓëÄÚÖÃËø£¨synchronized¹Ø¼ü×Ö£©Ïà±È£¬ÏÔÊ½ËøÌṩÁ˸üÁé»îµÄËø¶¨»úÖÆ£¬°üÀ¨³¢ÊÔËø¶¨¡¢¶¨Ê±Ëø¶¨¡¢ÖжÏËø¶¨µÈ¡£

    2. ³£ÓÃÏÔÊ½ËøÊµÏÖÀà

    - `ReentrantLock`£º¿ÉÖØÈëËø£¬Ö§³Ö¹«Æ½ºÍ·Ç¹«Æ½Ëø£¬¿ÉÒÔÏÔʽµØ¼ÓËøºÍ½âËø¡£

    - `ReentrantReadWriteLock`£º¿ÉÖØÈëµÄ¶ÁÐ´Ëø£¬ÔÊÐí¶à¸öÏß³Ìͬʱ¶ÁÈ¡£¬µ«Ö»ÔÊÐíÒ»¸öÏß³ÌдÈë¡£

    - `Condition`£ºÓë`ReentrantLock`½áºÏʹÓã¬ÌṩÀàËÆ`Object.wait()`ºÍ`Object.notify()`µÄ¹¦ÄÜ¡£

    - `Semaphore`£ºÐźÅÁ¿£¬ÓÃÓÚ¿ØÖƶÔ×ÊÔ´µÄ·ÃÎÊÁ¿£¬¿ÉÒÔÏÞÖÆÍ¬Ê±·ÃÎÊij×ÊÔ´µÄÏß³ÌÊýÁ¿¡£

    - `CountDownLatch`£º±ÕËø£¬ÔÊÐíÒ»¸ö»ò¶à¸öÏ̵߳ȴýÆäËûÏß³ÌÍê³É²Ù×÷¡£

    - `CyclicBarrier`£ºÑ­»·ÆÁÕÏ£¬ÔÊÐí¶à¸öÏß³ÌÏ໥µÈ´ý£¬Ö±µ½ËùÓÐÏ̶߳¼´ïµ½Ä³¸öÆÁÕϵãºó²Å¼ÌÐøÖ´ÐС£

    3. ¾ßÌå°¸Àý

    - `ReentrantLock`°¸Àý£ºÊ¹ÓÃ`ReentrantLock`ʵÏÖÒ»¸ö¼òµ¥µÄḬ̈߳²È«µÄ¼ÆÊýÆ÷¡£

    ```java

    import java.util.concurrent.locks.Lock;

    import java.util.concurrent.locks.ReentrantLock;

    public class Counter {

    private int count = 0;

    private final Lock lock = new ReentrantLock();

    public void increment() {

    lock.lock();

    try {

    count++;

    } finally {

    lock.unlock();

    }

    }

    public int getCount() {

    return count;

    }

    }

    ```

    - `ReentrantReadWriteLock`°¸Àý£ºÊ¹ÓÃ`ReentrantReadWriteLock`±£»¤Ò»¸ö»º´æ£¬ÔÊÐí¶à¸öÏß³Ìͬʱ¶ÁÈ¡£¬µ«Ð´ÈëʱÐèÒª¶ÀÕ¼Ëø¡£

    - `Semaphore`°¸Àý£ºÊ¹ÓÃ`Semaphore`¿ØÖÆÒ»¸öÍ£³µ³¡Èë¿Ú£¬ÏÞÖÆÍ¬Ê±½øÈëµÄ³µÁ¾ÊýÁ¿¡£

    4. ×¢ÒâÊÂÏî

    - ʹÓÃÏÔÊ½ËøÊ±£¬±ØÐëÏÔʽµØÔÚ´úÂëÖе÷ÓÃ`lock()`·½·¨¼ÓËø£¬ÒÔ¼°ÔÚ`finally`¿éÖе÷ÓÃ`unlock()`·½·¨ÊÍ·ÅËø£¬ÒÔ±ÜÃâËÀËø»ò×ÊԴй©¡£

    - `ReentrantLock`Ö§³ÖÖжÏÏìÓ¦£¬¿ÉÒÔÔڵȴýËøµÄ¹ý³ÌÖб»Öжϣ¬´Ó¶ø±ÜÃâÏ̳߳¤Ê±¼ä×èÈû¡£

    - µ±Ê¹ÓÃ`ReentrantReadWriteLock`ʱ£¬¶ÁËø¿ÉÒÔÓɶà¸ö¶ÁÏß³Ìͬʱ³ÖÓУ¬µ«Ð´ËøÊǶÀÕ¼µÄ£¬¼´Ð´²Ù×÷ÆÚ¼ä²»ÔÊÐí¶Á²Ù×÷¡£

    - ʹÓÃ`Semaphore`ʱ£¬ÒªÈ·±£ÔÚÊʵ±µÄʱºòÊÍ·ÅÐí¿É£¬Í¨³£ÊÇÔÚ`finally`¿éÖÐÊÍ·Å¡£

    - ÔÚʹÓÃ`CountDownLatch`ʱ£¬¼ÆÊýÆ÷±ØÐë´óÓÚµÈÓÚ0£¬ÇÒÖ»Äܵݼõ£¬²»ÄܵÝÔö¡£µ±¼ÆÊýÆ÷´ïµ½0ʱ£¬ËùÓеȴýµÄÏ߳̽«±»»½ÐÑ¡£

    - ÔÚʹÓÃ`CyclicBarrier`ʱ£¬ËùÓÐÏ̶߳¼±ØÐë´ïµ½ÆÁÕϵ㣬²ÅÄܼÌÐøÖ´ÐкóÐø²Ù×÷¡£ÆÁÕÏ¿ÉÒÔÖØÖã¬ÔÊÐíÒ»×éеÄÏß³ÌÔÙ´Îͬ²½¡£

    Îå¡¢ËøµÄÓÅ»¯Óë×¢ÒâÊÂÏî

    javaÖеÄËøÔõôʵÏÖ

    1. ËøµÄÓÅ»¯

    - ¼õÉÙËøµÄ³ÖÓÐʱ¼ä£º¾¡Á¿¼õÉÙÔÚËøÄÚÖ´ÐеIJÙ×÷£¬Ö»±£»¤±ØÒªµÄ´úÂë¶Î£¬ÀýÈ磬½ö¶Ô¹²ÏíÊý¾Ý½á¹¹µÄ¸üвÙ×÷¼ÓËø¡£

    - Ëø·Ö¶Î£º¶ÔÓÚÊý¾Ý½á¹¹ÈçArrayList¡¢HashMap£¬¿ÉÒÔʹÓ÷ֶÎËø£¨ÈçConcurrentHashMap£©À´¼õÉÙËøµÄ¾ºÕù£¬Ìá¸ß²¢·¢ÐÔÄÜ¡£

    - ʹÓöÁÐ´Ëø£º¶ÔÓÚ¶Á¶àдÉٵij¡¾°£¬Ê¹ÓöÁÐ´Ëø£¨ÈçReentrantReadWriteLock£©¿ÉÒÔÔÊÐí¶à¸ö¶Á²Ù×÷ͬʱ½øÐУ¬¶øÐ´²Ù×÷ÔòÐèÒª¶ÀÕ¼Ëø¡£

    - ʹÓÃÌõ¼þËø£ºµ±ÐèÒª¶à¸öÌõ¼þ¶ÓÁÐʱ£¬Ê¹ÓÃCondition¶ÔÏóÓëReentrantLock½áºÏ£¬¿ÉÒÔÌṩ¸üÁé»îµÄÏß³Ìͬ²½»úÖÆ¡£

    ¾ßÌå°¸Àý£º

    - ÔÚʵÏÖ»º´æÏµÍ³Ê±£¬Ê¹Ó÷ֶÎËøÀ´¹ÜÀí»º´æÌõÄ¿£¬¿ÉÒÔ¼õÉÙËøµÄ¾ºÕù£¬Ìá¸ß»º´æµÄ¶ÁдÐÔÄÜ¡£

    - ÔÚWebÓ¦ÓÃÖУ¬¶ÔÓÚ¸ßÆµ¶Á²Ù×÷µÄÊý¾Ý£¬Ê¹ÓöÁÐ´Ëø¿ÉÒÔÏÔÖøÌá¸ß²¢·¢·ÃÎʵÄÐÔÄÜ¡£

    2. ×¢ÒâÊÂÏî

    - ±ÜÃâËÀËø£ºÈ·±£»ñÈ¡ËøµÄ˳ÐòÒ»Ö£¬±ÜÃâÑ­»·µÈ´ýµÄÇé¿ö·¢Éú¡£ÀýÈ磬Èç¹ûÏß³ÌAÐèÒªÏÈ»ñÈ¡Ëø1ÔÙ»ñÈ¡Ëø2£¬ÄÇôÏß³ÌBÒ²Ó¦µ±°´ÕÕͬÑùµÄ˳Ðò»ñÈ¡Ëø¡£

    - ±ÜÃâËøÐ¹Â¶£ºÔÚ·¢ÉúÒ쳣ʱ£¬È·±£ËøÄܹ»±»ÊÍ·Å£¬Í¨³£Ê¹ÓÃtry-finally½á¹¹»òtry-with-resourcesÓï¾äÀ´¹ÜÀíËøµÄÊÍ·Å¡£

    - ±ÜÃâ²»±ØÒªµÄËø£º²»Òª¶Ô²»ÐèҪͬ²½µÄ´úÂë¶Î¼ÓËø£¬ÕâÑù¿ÉÒÔ¼õÉÙËøµÄ¿ªÏú¡£

    ¾ßÌ寷ů/²úÆ·°¸Àý£º

    - ʹÓÃJava×Ô´øµÄ`java.util.concurrent`°üÖеÄËøÊµÏÖ£¬Èç`ReentrantLock`¡¢`ReadWriteLock`µÈ£¬¶ø²»ÊÇ×Ô¼ºÊµÏÖËø»úÖÆ¡£

    - ÔÚʹÓÃSpring¿ò¼Üʱ£¬¿ÉÒÔÀûÓÃÆäÌṩµÄ`@Lock`×¢½âÀ´¼ò»¯ËøµÄʹÓã¬ÀýÈçʹÓÃ`@Lock(LockType.READ)`À´±ê×¢¶Á²Ù×÷¡£

    ×¢ÒâÆ·ÅÆ/²úÆ·£º

    - `ReentrantLock`£ºJavaÄÚÖõĿÉÖØÈëËø¡£

    - `ReadWriteLock`£ºJavaÌṩµÄ¶ÁÐ´Ëø½Ó¿Ú£¬¾ßÌåʵÏÖ¿ÉÒÔÊÇ`ReentrantReadWriteLock`¡£

    - `ConcurrentHashMap`£ºJavaÌṩµÄḬ̈߳²È«µÄ¹þÏ£±í£¬ÄÚ²¿Ê¹Ó÷ֶÎËø»úÖÆ¡£

    - `Condition`£ºÓë`ReentrantLock`ÅäºÏʹÓã¬ÌṩÀàËÆ`Object.wait()`ºÍ`Object.notify()`µÄ¹¦ÄÜ¡£

    Áù¡¢²¢·¢¹¤¾ßÀàÖеÄËøÊµÏÖ

    javaÖеÄËøÔõôʵÏÖ

    1. java.util.concurrent.locks.Lock½Ó¿Ú

    - ¾ßÌåʵÏÖ£ºReentrantLock¡¢ReentrantReadWriteLock¡¢Condition

    a. ReentrantLock

    - °¸ÀýÓ¦ÓãºReentrantLockÊÇÒ»¸ö¿ÉÖØÈëµÄ»¥³âËø£¬ËüÌṩÁËÓësynchronized¹Ø¼ü×ÖÏàËÆµÄͬ²½¹¦ÄÜ£¬µ«ÌṩÁ˸ü·á¸»µÄ¹¦ÄÜ£¬Èç¿ÉÖжϵÄËø»ñÈ¡¡¢³¢ÊÔ·Ç×èÈûµØ»ñÈ¡Ëø¡¢Ö§³Ö¹«Æ½ËøµÈ¡£

    - ×¢ÒâÊÂÏReentrantLock±ØÐëÏÔʽµØÊÍ·ÅËø£¬Í¨³£ÔÚfinally¿éÖÐÊÍ·Å£¬ÒÔ±ÜÃâËÀËø¡£

    b. ReentrantReadWriteLock

    - °¸ÀýÓ¦ÓãºReentrantReadWriteLockÔÊÐí¶à¸öÏß³Ìͬʱ¶ÁÈ¡£¬µ«Ö»ÔÊÐíÒ»¸öÏß³ÌдÈë¡£ÊÊÓÃÓÚ¶Á¶àдÉٵij¡¾°£¬¿ÉÒÔÌá¸ß³ÌÐòµÄÐÔÄÜ¡£

    - ×¢ÒâÊÂÏReentrantReadWriteLockÌṩÁ˶ÁËøºÍÐ´Ëø£¬Ê¹ÓÃʱÐèÒªÃ÷È·Ñ¡ÔñºÏÊʵÄËøÀàÐÍ£¬²¢ÇÒÈ·±£ÔÚÈκÎʱºò¶¼ÕýÈ·ÊÍ·ÅËø¡£

    c. Condition

    - °¸ÀýÓ¦ÓãºConditionÓëReentrantLock½áºÏʹÓã¬ÌṩÀàËÆObject.wait()ºÍObject.notify()µÄ¹¦ÄÜ£¬ÔÊÐíÏß³ÌÔÚij¸öÌõ¼þϵȴý»ò±»»½ÐÑ¡£

    - ×¢ÒâÊÂÏʹÓÃConditionʱ£¬ÐèÒªÓëReentrantLockÒ»ÆðʹÓ㬲¢ÔÚ»ñÈ¡ËøÖ®ºóµ÷ÓÃawait()£¬ÔÚÊÍ·ÅËøÖ®Ç°µ÷ÓÃsignal()»òsignalAll()¡£

    2. java.util.concurrent°üÖÐµÄÆäËûËø

    - ¾ßÌåʵÏÖ£ºSemaphore¡¢CountDownLatch¡¢CyclicBarrier¡¢Exchanger

    a. Semaphore

    - °¸ÀýÓ¦ÓãºSemaphoreÊÇÒ»¸ö¼ÆÊýÐźÅÁ¿£¬Ö÷ÒªÓÃÓÚÏÞÖÆ¿ÉÒÔͬʱ·ÃÎÊij¸öÌØ¶¨×ÊÔ´µÄÏß³ÌÊýÁ¿¡£ÀýÈ磬ÓÃÓÚ¿ØÖÆÒ»¸ö¹Ì¶¨ÊýÁ¿µÄÏ̷߳ÃÎÊ´òÓ¡»ú¡£

    - ×¢ÒâÊÂÏSemaphoreÐèÒªÏÔʽµØÊÍ·ÅÐí¿É£¬Í¨³£ÔÚfinally¿éÖе÷ÓÃrelease()¡£

    b. CountDownLatch

    - °¸ÀýÓ¦ÓãºCountDownLatchÔÊÐíÒ»¸ö»ò¶à¸öÏ̵߳ȴýÆäËûÏß³ÌÍê³É²Ù×÷¡£ÀýÈ磬ÔÚ¶à¸öÏß³ÌÖ´ÐÐÍê¸÷×Եijõʼ»¯ÈÎÎñºó£¬Ö÷Ï̲߳żÌÐøÖ´ÐС£

    - ×¢ÒâÊÂÏCountDownLatchµÄ¼ÆÊýÖ»Äܵݼõ£¬²»ÄܵÝÔö£¬Ò»µ©¼ÆÊý´ïµ½Á㣬¾Í²»ÄÜÔÙ¼ÌÐøµÈ´ý¡£

    c. CyclicBarrier

    - °¸ÀýÓ¦ÓãºCyclicBarrierÔÊÐíÒ»×éÏ̻߳¥ÏàµÈ´ý£¬Ö±µ½ËùÓÐÏ̶߳¼´ïµ½Ä³¸öÆÁÕϵãºóÔÙ¼ÌÐøÖ´ÐС£ÊÊÓÃÓÚʵÏÖ²¢ÐмÆËã»ò²¢Ðн׶εÄÈÎÎñ¡£

    - ×¢ÒâÊÂÏCyclicBarrierÔÚËùÓÐÏ̵߳½´ïÆÁÕϵãºó»áÖØÖüÆÊý£¬ÔÊÐíÒ»×éеÄÏß³ÌʹÓá£

    d. Exchanger

    - °¸ÀýÓ¦ÓãºExchangerÔÊÐíÔÚ²¢·¢Ïß³ÌÖ®¼ä½»»»Êý¾Ý¡£ÊÊÓÃÓÚÒÅ´«Ëã·¨¡¢Á÷Ë®ÏßÉè¼ÆµÈ³¡¾°¡£

    - ×¢ÒâÊÂÏExchangerµÄʹÓÃÐèҪȷ±£²ÎÓë½»»»µÄÏß³ÌÊýÁ¿ºÍ½»»»Ê±»úÕýÈ·£¬·ñÔò¿ÉÄܵ¼ÖÂÏß³Ì×èÈû¡£

    3. java.util.concurrent.atomic°üÖеÄËø

    - ¾ßÌåʵÏÖ£ºAtomicInteger¡¢AtomicReferenceµÈÔ­×ÓÀà

    - °¸ÀýÓ¦ÓãºÔ­×ÓÀàÌṩÁËÒ»ÖÖÎÞËøµÄḬ̈߳²È«²Ù×÷¹²Ïí±äÁ¿µÄ·½Ê½¡£ÀýÈ磬ʹÓÃAtomicInteger½øÐÐḬ̈߳²È«µÄ¼ÆÊý¡£

    - ×¢ÒâÊÂÏԭ×ÓÀàÊÊÓÃÓÚ¼òµ¥²Ù×÷£¬Èç»ù±¾ÀàÐ͵ĸ³ÖµºÍ±È½Ï¡£¶ÔÓÚ¸´ÔÓ²Ù×÷£¬ÈÔÈ»ÐèҪʹÓÃËøÀ´±£Ö¤Ḭ̈߳²È«¡£

    Æß¡¢°¸Àý·ÖÎöÓëʵ¼ù

    javaÖеÄËøÔõôʵÏÖ

    1. °¸ÀýÒ»£ºsynchronized¹Ø¼ü×ÖµÄʹÓÃ

    - ʵÏÖÆ·ÅÆ£ºJavaÄÚÖÃËø

    - °¸ÀýÃèÊö£º¼ÙÉèÓÐÒ»¸ö¼òµ¥µÄÒøÐÐÕË»§À࣬¸ÃÀà°üº¬´æ¿îºÍÈ¡¿îµÄ·½·¨¡£ÎªÁËÈ·±£ÔÚ¶àÏ̻߳·¾³ÏÂÕË»§Óà¶îµÄḬ̈߳²È«£¬¿ÉÒÔʹÓÃsynchronized¹Ø¼ü×ÖÀ´Í¬²½ÕâЩ·½·¨¡£

    - ´úÂëʾÀý£º

    ```java

    public class BankAccount {

    private double balance;

    public synchronized void deposit(double amount) {

    balance += amount;

    }

    public synchronized void withdraw(double amount) {

    if (amount <= balance) {

    balance -= amount;

    }

    }

    }

    ```

    - ×¢ÒâÊÂÏsynchronized¹Ø¼ü×ÖÊÊÓÃÓÚ¼òµ¥µÄͬ²½ÐèÇ󣬵«¶ÔÓÚ¸´ÔÓµÄͬ²½³¡¾°£¬¿ÉÄÜ»áÒýÆðÐÔÄÜÎÊÌâ¡£

    2. °¸Àý¶þ£ºReentrantLockµÄʹÓÃ

    - ʵÏÖÆ·ÅÆ£ºJavaÏÔÊ½Ëø

    - °¸ÀýÃèÊö£ºÔÚʵÏÖÒ»¸ö¸´ÔӵĹɯ±½»Ò×ϵͳʱ£¬¿ÉÄÜÐèÒª¸üÁé»îµÄËø¿ØÖÆ£¬´Ëʱ¿ÉÒÔʹÓÃReentrantLock¡£

    - ´úÂëʾÀý£º

    ```java

    import java.util.concurrent.locks.ReentrantLock;

    public class StockTrade {

    private ReentrantLock lock = new ReentrantLock();

    private int shares;

    public void buy(int quantity) {

    lock.lock();

    try {

    shares += quantity;

    } finally {

    lock.unlock();

    }

    }

    public void sell(int quantity) {

    lock.lock();

    try {

    if (quantity <= shares) {

    shares -= quantity;

    }

    } finally {

    lock.unlock();

    }

    }

    }

    ```

    - ×¢ÒâÊÂÏReentrantLockÌṩÁ˱Èsynchronized¸ü·á¸»µÄ¹¦ÄÜ£¬Èç¿ÉÖжϵÄËø»ñÈ¡¡¢³¢ÊÔ·Ç×èÈûµØ»ñÈ¡Ëø¡¢Ö§³Ö¹«Æ½ËøµÈ¡£

    3. °¸ÀýÈý£ºÊ¹ÓöÁÐ´Ëø£¨ReadWriteLock£©

    - ʵÏÖÆ·ÅÆ£ºJava¶ÁÐ´Ëø

    - °¸ÀýÃèÊö£ºÔÚʵÏÖÒ»¸ö¶àÏ̻߳º´æÏµÍ³Ê±£¬ÎªÁËÌá¸ß¶Á²Ù×÷µÄ²¢·¢ÐÔÄÜ£¬¿ÉÒÔʹÓÃReadWriteLock¡£

    - ´úÂëʾÀý£º

    ```java

    import java.util.concurrent.locks.ReadWriteLock;

    import java.util.concurrent.locks.ReentrantReadWriteLock;

    public class Cache {

    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    private final Map cache = new HashMap<>();

    public void put(String key, Object value) {

    lock.writeLock().lock();

    try {

    cache.put(key, value);

    } finally {

    lock.writeLock().unlock();

    }

    }

    public Object get(String key) {

    lock.readLock().lock();

    try {

    return cache.get(key);

    } finally {

    lock.readLock().unlock();

    }

    }

    }

    ```

    - ×¢ÒâÊÂÏReadWriteLockÔÊÐí¶à¸ö¶ÁÏß³Ìͬʱ·ÃÎÊ£¬µ«Ð´Ï̷߳ÃÎÊʱ±ØÐë¶ÀÕ¼Ëø£¬ÊÊÓÃÓÚ¶Á¶àдÉٵij¡¾°¡£

    4. °¸ÀýËÄ£ºÊ¹Óò¢·¢¹¤¾ßÀࣨÈçSemaphore¡¢CountDownLatch£©

    - ʵÏÖÆ·ÅÆ£ºJava²¢·¢¹¤¾ßÀà

    - °¸ÀýÃèÊö£ºÔÚʵÏÖÒ»¸ö¶àÏß³ÌµÄÆ±Îñϵͳʱ£¬¿ÉÒÔʹÓÃSemaphoreÀ´¿ØÖƲ¢·¢·ÃÎʵÄÊýÁ¿£¬»òÕßʹÓÃCountDownLatchÀ´Í¬²½¶à¸öÏ̵߳ÄÖ´ÐС£

    - ´úÂëʾÀý£º

    ```java

    import java.util.concurrent.Semaphore;

    import java.util.concurrent.CountDownLatch;

    public class TicketSystem {

    private final Semaphore semaphore = new Semaphore(10); // ÏÞÖÆÍ¬Ê±¹ºÆ±µÄÈËÊý

    private final CountDownLatch latch = new CountDownLatch(1); // µÈ´ýËùÓÐÏß³Ì×¼±¸¾ÍÐ÷

    public void buyTicket() throws InterruptedException {

    semaphore.acquire();

    try {

    // ¹ºÆ±Âß¼­

    } finally {

    semaphore.release();

    }

    }

    public void start() {

    // ËùÓÐÏß³Ì×¼±¸¾ÍÐ÷

    latch.countDown();

    }

    public void waitForAll() throws InterruptedException {

    latch.await(); // µÈ´ýËùÓÐÏ߳̿ªÊ¼Ö´ÐÐ

    }

    }

    ```

    - ×¢ÒâÊÂÏ²¢·¢¹¤¾ßÀàÌṩÁ˸ü¸ß¼¶µÄͬ²½»úÖÆ£¬ÊÊÓÃÓÚ¸´ÔӵIJ¢·¢¿ØÖƳ¡¾°¡£Ê¹ÓÃʱҪעÒâÏ̼߳äµÄЭµ÷ºÍͬ²½¡£

    ͨ¹ýÒÔÉϰ¸Àý·ÖÎö£¬ÎÒÃÇ¿ÉÒÔ¿´µ½²»Í¬µÄËø»úÖÆÔÚJavaÖеÄÓ¦ÓúÍʵ¼ù£¬ÒÔ¼°ËüÃÇÔÚ½â¾ö¾ßÌåÎÊÌâʱµÄÓÅÊÆºÍ×¢ÒâÊÂÏî¡£ÔÚʵ¼Ê¿ª·¢ÖУ¬Ó¦¸ù¾Ý¾ßÌ峡¾°Ñ¡ÔñºÏÊʵÄËø»úÖÆÀ´±£Ö¤Ḭ̈߳²È«²¢Ìá¸ß³ÌÐòÐÔÄÜ¡£

    ÐÂÎÅÍÆ¼ö

    ÓÑÇéÁ´½Ó£º

    ÔÚÏ߿ͷþ £º ·þÎñÈÈÏߣº400-8609-529 µç×ÓÓÊÏä:

    ¹«Ë¾µØÖ·£º¹ã¶«Ê¡¹ãÖÝÊÐ

    ...

    ¸ÓICP±¸2021010586ºÅ-4
    ¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿