¾ÅÓΡ¤»á(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
Powered by EyouCms
¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿