1. ËøµÄ¸ÅÄî
- ËøÊÇÒ»ÖÖͬ²½»úÖÆ£¬ÓÃÓÚ¿ØÖƶԹ²Ïí×ÊÔ´µÄ·ÃÎÊ£¬È·±£Í¬Ò»Ê±¿ÌÖ»ÓÐÒ»¸öÏ߳̿ÉÒÔ²Ù×÷¹²Ïí×ÊÔ´¡£
- ÔÚJavaÖУ¬ËøÓÃÓÚ½â¾ö¶àÏ̲߳¢·¢Ê±¿ÉÄܳöÏֵľºÕùÌõ¼þÎÊÌ⣬ȷ±£Ḭ̈߳²È«¡£
2. ËøµÄ×÷ÓÃ
- ±ÜÃâÊý¾Ý²»Ò»Ö£ºÔÚ¶àÏ̻߳·¾³Ï£¬¶à¸öÏ߳̿ÉÄÜͬʱÐÞ¸ÄͬһÊý¾Ý£¬Ê¹ÓÃËø¿ÉÒÔ±ÜÃâÕâÖÖÇé¿öÏÂÊý¾ÝµÄ²»Ò»Ö¡£
- ·ÀÖ¹ËÀËø£ºËÀËøÊÇÖ¸¶à¸öÏß³ÌÒòΪ»¥ÏàµÈ´ý¶Ô·½ÊÍ·ÅËø¶øÎÞ·¨¼ÌÐøÖ´ÐеÄ״̬¡£Í¨¹ýºÏÀíʹÓÃËø£¬¿ÉÒÔ½µµÍËÀËø·¢ÉúµÄ¸ÅÂÊ¡£
- Ìá¸ß³ÌÐòÐÔÄÜ£ººÏÀíʹÓÃËø¿ÉÒÔÌá¸ß³ÌÐòÔÚ¶àÏ̻߳·¾³ÏµÄÐÔÄÜ£¬¼õÉÙ×ÊÔ´¾ºÕù´øÀ´µÄ¿ªÏú¡£
3. ¾ßÌå°¸Àý
- ÀýÈ磬ÔÚʵÏÖÉú²úÕß-Ïû·ÑÕßģʽʱ£¬Ê¹ÓÃËøÀ´±£Ö¤Éú²úÕߺÍÏû·ÑÕßÖ®¼äµÄͬ²½£¬·ÀÖ¹Éú²úÕßÔÚ»º³åÇøÂúʱ¼ÌÐøÉú²ú£¬»òÕßÏû·ÑÕßÔÚ»º³åÇø¿Õʱ¼ÌÐøÏû·Ñ¡£
- ÔÚ¶àÏ̻߳·¾³Ï£¬¶Ô¹²ÏíÊý¾Ý½á¹¹ÈçArrayList¡¢HashMapµÈ½øÐвÙ×÷ʱ£¬Ê¹ÓÃËøÀ´È·±£Ḭ̈߳²È«£¬·ÀÖ¹³öÏÖÊý¾Ý²»Ò»ÖµÄÇé¿ö¡£
4. ×¢ÒâÊÂÏî
- ʹÓÃËøÊ±£¬ÐèÒª×ñÑ¡°ÏÈ»ñÈ¡Ëø£¬ºó²Ù×÷×ÊÔ´£¬×îºóÊÍ·ÅËø¡±µÄÔÔò¡£
- ÔÚʹÓÃËøµÄ¹ý³ÌÖУ¬Òª¾¡Á¿±ÜÃⳤʱ¼ä³ÖÓÐËø£¬ÒÔ¼õÉÙÆäËûÏ̵߳ĵȴýʱ¼ä¡£
- ÔÚÉè¼ÆËøÊ±£¬Òª¿¼ÂÇËøµÄÁ£¶È£¬ºÏÀíÑ¡ÔñËøµÄÀàÐÍ£¬ÒÔÌá¸ß³ÌÐòµÄÐÔÄÜ¡£
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Щ³¡¾°ÏÂÌá¸ß³ÌÐòÐÔÄÜ¡£
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()`µÄ¹¦ÄÜ¡£
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`ʱ£¬ËùÓÐÏ̶߳¼±ØÐë´ïµ½ÆÁÕϵ㣬²ÅÄܼÌÐøÖ´ÐкóÐø²Ù×÷¡£ÆÁÕÏ¿ÉÒÔÖØÖã¬ÔÊÐíÒ»×éеÄÏß³ÌÔÙ´Îͬ²½¡£
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()`µÄ¹¦ÄÜ¡£
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½øÐÐḬ̈߳²È«µÄ¼ÆÊý¡£
- ×¢ÒâÊÂÏÔ×ÓÀàÊÊÓÃÓÚ¼òµ¥²Ù×÷£¬Èç»ù±¾ÀàÐ͵ĸ³ÖµºÍ±È½Ï¡£¶ÔÓÚ¸´ÔÓ²Ù×÷£¬ÈÔÈ»ÐèҪʹÓÃËøÀ´±£Ö¤Ḭ̈߳²È«¡£
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
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ÖеÄÓ¦ÓúÍʵ¼ù£¬ÒÔ¼°ËüÃÇÔÚ½â¾ö¾ßÌåÎÊÌâʱµÄÓÅÊÆºÍ×¢ÒâÊÂÏî¡£ÔÚʵ¼Ê¿ª·¢ÖУ¬Ó¦¸ù¾Ý¾ßÌ峡¾°Ñ¡ÔñºÏÊʵÄËø»úÖÆÀ´±£Ö¤Ḭ̈߳²È«²¢Ìá¸ß³ÌÐòÐÔÄÜ¡£
?ÈçºÎ¼õС¿Õµ÷Íâ»úÔëÒôËæ×ÅÏļ¾µÄÀ´ÁÙ£¬Ô½À´Ô½¶àµÄÈË¿ªÊ¼Ê¹Óÿյ÷ÒÔ½µµÍÊÒÄÚζȡ£È»¶ø£¬ÓÉÓÚ¿Õµ÷Íâ»úµÄ·¢³öµÄÔëÒôÎÊÌ⣬ÍùÍù»á¸ø...
?1¡¢¿Õµ÷³öÏÖ¹ÊÕÏÔõô°ì£¿¼ÒÓÿյ÷ÔÚʹÓÃÒ»¶Îʱ¼äºó£¬¿ÉÄÜ»á³öÏÖ¸÷ÖÖ¸÷ÑùµÄ¹ÊÕÏ£¬ÀýÈç£ºÖÆÀäЧ¹û½µµÍ¡¢ÔëÒô¼Ó´ó¡¢Â©Ë®µÈ¡£Õâʱºò...
?±ùÏäÒ»Ê±ÖÆÀäһʱ²»ÖÆÀ䵯²»ÁÁÊÇÔõô»ØÊÂÏÖÔÚµÄÉú»îÖУ¬µçÆ÷ÒѾ³ÉÁËÎÒÃǼÒÍ¥Öв»¿ÉȱÉÙµÄÒ»²¿·Ö£¬¶ø±ùÏä¾ÍÊÇÎÒÃÇÉú»îÖв»¿ÉȱÉÙ...
³µÁ¾¿Õµ÷½ø·ç¿Ú¹ýÂËÍø¿ÉÒÔ²ðжÂ𣿳µÁ¾¿Õµ÷½ø·ç¿Ú¹ýÂËÍøÊdzµÁ¾¿Õµ÷µÄÖØÒª×é³É²¿·Ö¡£Ëü¿ÉÒÔ¹ýÂ˽øÈë³µÄÚµÄ¿ÕÆø£¬´Ó¶ø¼õС³µÄÚ»Ò³¾...
1¡¢Òø´¨ÃÀµÄ¿Õµ÷ÊÛºó·þÎñµç»°ÃÀµÄ¿Õµ÷×÷Ϊ¹úÄÚÖªÃûÆ·ÅÆ£¬ÌṩÁËÓÅÖʵIJúÆ·ºÍ·þÎñ¡£µ«¼´±ãÊÇÖÊÁ¿ÔٺõÄÉÌÆ·Ò²ÄÑÃâ³öÏÖÎÊÌ⣬ÔÚ´Ë...
1¡¢¿Õµ÷άÐÞÐÐÒµÏÖ×´Ëæ×ÅÈËÃÇÉú»îˮƽµÄ²»¶ÏÌá¸ß£¬¿Õµ÷³ÉΪÁËÏÖ´úÈ˼ÒÍ¥ºÍ°ì¹«ÊÒ³£¼ûµÄµçÆ÷Ö®Ò»¡£È»¶ø£¬ËæÖ®¶øÀ´µÄÊǿյ÷¹ÊÕϵÄ...