¸ÅÊö
java.util°üÖеĴ󲿷ÖÈÝÆ÷¶¼ÊÇ·ÇḬ̈߳²È«µÄ£¬ÈôÒªÔÚ¶àÏß³ÌÖÐʹÓÃÈÝÆ÷£¬Äã¿ÉÒÔʹÓÃCollectionsÌṩµÄ°ü×°º¯Êý£ºsynchronizedXXX£¬½«ÆÕͨÈÝÆ÷±ä³ÉḬ̈߳²È«µÄÈÝÆ÷¡£µ«¸Ã·½·¨½ö½öÊǼòµ¥µØ¸øÈÝÆ÷ʹÓÃͬ²½£¬Ð§Âʺܵ͡£Òò´Ë²¢·¢´óʦDoug
LeaÌṩÁËjava.util.concurrent°ü£¬Ìṩ¸ßЧµÄ²¢·¢ÈÝÆ÷¡£²¢ÇÒΪÁ˱£³ÖÓëÆÕͨµÄÈÝÆ÷µÄ½Ó¿ÚÒ»ÖÂÐÔ£¬ÈÔȻʹÓÃutil°üµÄ½Ó¿Ú£¬´Ó¶øÒ×ÓÚʹÓá¢Ò×ÓÚÀí½â¡£
PS£ºÎÊÌ⣺synchronizedXXX¾¿¾¹¶ÔÈÝÆ÷×öÁËʲô´Ó¶øÄÜ´ïµ½Ḭ̈߳²È«µÄÄ¿µÄ£¿
Ààͼ
ListºÍSet

JUC°üÖÐList½Ó¿ÚµÄʵÏÖÀࣺCopyOnWriteArrayList
CopyOnWriteArrayListÊÇḬ̈߳²È«µÄArrayList
JUC°üÖÐSet½Ó¿ÚµÄʵÏÖÀࣺCopyOnWriteArraySet¡¢ConcurrentSkipListSet
CopyOnWriteArraySetÊÇḬ̈߳²È«µÄSet£¬ËüÄÚ²¿°üº¬ÁËÒ»¸öCopyOnWriteArrayList£¬Òò´Ë±¾ÖÊÉÏÊÇÓÉCopyOnWriteArrayListʵÏֵġ£
ConcurrentSkipListSetÏ൱ÓÚḬ̈߳²È«µÄTreeSet¡£ËüÊÇÓÐÐòµÄSet¡£ËüÓÉConcurrentSkipListMapʵÏÖ¡£
Map

ConcurrentHashMap£ºḬ̈߳²È«µÄHashMap¡£²ÉÓ÷ֶÎËøÊµÏÖ¸ßЧ²¢·¢¡£
ConcurrentSkipListMap£ºḬ̈߳²È«µÄÓÐÐòMap¡£Ê¹ÓÃÌø±íʵÏÖ¸ßЧ²¢·¢¡£
Queue

ConcurrentLinkedQueue£ºḬ̈߳²È«µÄÎÞ½ç¶ÓÁС£µ×²ã²ÉÓõ¥Á´±í¡£Ö§³ÖFIFO¡£
ConcurrentLinkedDeque£ºḬ̈߳²È«µÄÎÞ½çË«¶Ë¶ÓÁС£µ×²ã²ÉÓÃË«ÏòÁ´±í¡£Ö§³ÖFIFOºÍFILO¡£
ArrayBlockingQueue£ºÊý×éʵÏÖµÄ×èÈû¶ÓÁС£
LinkedBlockingQueue£ºÁ´±íʵÏÖµÄ×èÈû¶ÓÁС£
LinkedBlockingDeque£ºË«ÏòÁ´±íʵÏÖµÄË«¶Ë×èÈû¶ÓÁС£
CopyOnWriteÈÝÆ÷£¨Ð´Ê±¸´ÖÆÈÝÆ÷£©
CopyOnWriteÈÝÆ÷°üÀ¨£ºCopyOnWriteArrayListºÍCopyOnWriteArraySet¡£
PS£ºCopyOnWriteArraySetÓÐCopyOnWriteArrayListʵÏÖ¡£
ÌØÐÔ
ÊÊÓÃÓÚ¶Á²Ù×÷Ô¶Ô¶¶àÓÚд²Ù×÷£¬²¢ÇÒÊý¾ÝÁ¿½ÏСµÄÇé¿ö¡£
ÐÞ¸ÄÈÝÆ÷µÄ´ú¼ÛÊǰº¹óµÄ£¬Òò´Ë½¨ÒéÅúÁ¿Ôö¼ÓaddAll¡¢ÅúÁ¿É¾³ýremoveAll¡£
CopyOnWriteÈÝÆ÷ÊÇÈçºÎʵÏÖḬ̈߳²È«µÄ£¿
ʹÓÃvolatileÐÞÊÎÊý×éÒýÓãºÈ·±£Êý×éÒýÓõÄÄÚ´æ¿É¼ûÐÔ¡£
¶ÔÈÝÆ÷Ð޸IJÙ×÷½øÐÐͬ²½£º´Ó¶øÈ·±£Í¬Ò»Ê±¿ÌÖ»ÄÜÓÐÒ»ÌõÏß³ÌÐÞ¸ÄÈÝÆ÷£¨ÒòΪÐÞ¸ÄÈÝÆ÷¶¼»á²úÉúÒ»¸öеÄÈÝÆ÷£¬Ôö¼Óͬ²½¿É±ÜÃâͬһʱ¿Ì¸´ÖÆÉú³É¶à¸öÈÝÆ÷£¬´Ó¶øÎÞ·¨±£Ö¤Êý×éÊý¾ÝµÄÒ»ÖÂÐÔ£©
ÐÞ¸Äʱ¸´ÖÆÈÝÆ÷£ºÈ·±£ËùÓÐÐ޸IJÙ×÷¶¼×÷ÓÃÔÚÐÂÊý×éÉÏ£¬Ô±¾µÄÊý×éÔÚ´´½¨¹ýºó¾ÍÓò»±ä»¯£¬´Ó¶øÆäËûÏ߳̿ÉÒÔ·ÅÐĵضÁ¡£
ÐÂÔö·½·¨
CopyOnWriteArrayList£º
// Ìí¼Ó¼¯ºÏÖв»´æÔÚµÄÔªËØ int addAllAbsent(Collection<? extends E> c) // ¸ÃÔªËØÈô²»´æÔÚÔòÌí¼Ó boolean addIfAbsent(E e) |
CopyOnWriteArraySet£ºÄ¾ÓÐÐÂÔö£¡
µü´ú
CopyOnWriteArrayListÓµÓÐÄÚ²¿ÀࣺCOWIterator£¬ËüÊÇListIteratorµÄ×ÓÀà¡£
µ±µ÷ÓÃiteratorº¯Êýʱ·µ»ØµÄÊÇCOWIterator¶ÔÏó¡£
COWIterator²»ÔÊÐíÐÞ¸ÄÈÝÆ÷£¬ÄãÈôµ÷ÓÃÔò»áÅ׳öUnsupportedOperationException¡£
Óŵã
¶Á²Ù×÷ÎÞÐè¼ÓËø£¬´Ó¶ø¸ßЧ¡£
ȱµã
Êý¾ÝÒ»ÖÂÐÔÎÊÌâ
ÓÉÓÚµü´úµÄÊÇÈÝÆ÷µ±Ç°µÄ¿ìÕÕ£¬Òò´ËÔÚµü´ú¹ý³ÌÖÐÈÝÆ÷·¢ÉúµÄÐ޸IJ¢²»ÄÜʵʱ±»µ±Ç°ÕýÔÚµü´úµÄÏ̸߳ÐÖª¡£
ÄÚ´æÕ¼ÓÃÎÊÌâ
ÓÉÓÚÐÞ¸ÄÈÝÆ÷¶¼»á¸´ÖÆÊý×飬´Ó¶øµ±Êý×鳬´óʱÐÞ¸ÄÈÝÆ÷ЧÂʺܵ͡£
PS£ºÒò´Ëдʱ¸´ÖÆÈÝÆ÷Êʺϴ洢СÈÝÁ¿Êý¾Ý¡£
ConcurrentHashMap
java.util°üÖÐÌṩÁËḬ̈߳²È«µÄHashTable£¬µ«Õâ¼Ò»ïÖ»ÊÇͨ¹ý¼òµ¥µÄͬ²½À´ÊµÏÖḬ̈߳²È«£¬Òò´ËЧÂʵ͡£Ö»ÒªÓÐÒ»ÌõÏ̻߳ñÈ¡ÁËÈÝÆ÷µÄËøÖ®ºó£¬ÆäËûËùÓеÄÏ̷߳ÃÎÊͬ²½º¯Êý¶¼»á±»×èÈû¡£Òò´Ëͬһʱ¿ÌÖ»ÄÜÓÐÒ»ÌõÏ̷߳ÃÎÊͬ²½º¯Êý¡£¶øConcurrentHashMap²ÉÓÃÁË·Ö¶ÎËø»úÖÆÊµÏÖ¸ßЧµÄ²¢·¢·ÃÎÊ¡£
·Ö¶ÎËøÔÀí
ConcurrentHashMapÓɶà¸öSegment¹¹³É£¬Ã¿¸öSegment¶¼°üº¬Ò»ÕŹþÏ£±í¡£Ã¿´Î²Ù×÷Ö»½«²Ù×÷Êý¾ÝËùÊôµÄSegmentËøÆðÀ´£¬´Ó¶ø±ÜÃ⽫Õû¸öËø×¡¡£
Êý¾Ý½á¹¹

ConcurrentHashMapÄÚ²¿°üº¬ÁËSegmentÊý×飬¶øÃ¿¸öSegmentÓּ̳Ð×ÔReentrantLock£¬Òò´ËËüÊÇÒ»°Ñ¿ÉÖØÈëµÄËø¡£
SegmentÄÚ²¿ÓµÓÐÒ»¸öHashEntryÊý×飬Ëü¾ÍÊÇÒ»ÕŹþÏ£±í¡£HashEntryÊǵ¥Á´±íµÄÒ»¸ö½Úµã£¬HashEntryÊý×é´æ´¢µ¥Á´±íµÄ±íÍ·½Úµã¡£
ÐÂÔöAPI
V putIfAbsent(K key, V value) |
ConcurrentSkipListMap
ËüÊÇÒ»¸öÓÐÐòµÄMap£¬Ï൱ÓÚTreeMap¡£
TreeMap²ÉÓúìºÚÊ÷ʵÏÖÅÅÐò£¬¶øConcurrentHashMap²ÉÓÃÌø±íʵÏÖÓÐÐò¡£
Ìø±íµÄÓÉÀ´
×÷Ó㺴洢ÓÐÐòÐòÁУ¬²¢ÇÒʵÏÖ¸ßЧµÄ²éÕÒÓë²åÈëɾ³ý¡£
´æ´¢ÓÐÐòÐòÁÐ×î¼òµ¥µÄ°ì·¨¾ÍÊÇʹÓÃÊý×飬´Ó¶ø²éÕÒ¿ÉÒÔ²ÉÓöþ·ÖËÑË÷£¬µ«²åÈëɾ³ýÐèÒªÒÆ¶¯ÔªËؽÏΪµÍЧ¡£
Òò´Ë³öÏÖÁ˶þ²æËÑË÷Ê÷£¬ÓÃÀ´½â¾ö²åÈëɾ³ýÒÆ¶¯ÔªËصÄÎÊÌâ¡£µ«¶þ²æËÑË÷Ê÷ÔÚ×Çé¿öÏ»áÍË»¯³ÉÒ»Ìõµ¥Á´±í£¬ËÑË÷µÄЧÂʽµÎªO(n)¡£
ΪÁ˱ÜÃâ¶þ²æËÑË÷Ê÷µÄÍË»¯£¬³öÏÖÁ˶þ²æÆ½ºâÊ÷£¬ËüÔÚÿ´Î²åÈëɾ³ý½Úµãºó¶¼»áÖØÐµ÷ÕûÊ÷ÐΣ¬Ê¹µÃËüÈÔÈ»±£³Öƽºâ£¬´Ó¶ø±£Ö¤ÁËËÑË÷ЧÂÊ£¬Ò²±£Ö¤Á˲åÈëɾ³ýµÄЧÂÊ¡£
´ËÍ⣬¸ù¾ÝƽºâËã·¨µÄ²»Í¬£¬¶þ²æÆ½ºâÊ÷ÓÖ·ÖΪ£ºB+Ê÷¡¢B-Ê÷¡¢ºìºÚÊ÷¡£
µ«Æ½ºâËã·¨¹ýÓÚ¸´ÔÓ£¬Òò´Ë³öÏÖÌø±í¡£
Ìø±í½éÉÜ

Ìø±íÊÇÌõÓÐÐòµÄµ¥Á´±í£¬ËüµÄÿ¸ö½Úµã¶¼Óжà¸öÖ¸Ïòºó¼Ì½ÚµãµÄÒýÓá£
ËüÓжà¸ö²ã´Î£¬Éϲ㶼ÊÇϲãµÄ×Ó¼¯£¬´Ó¶øÄÜÌø¹ý²»±ØÒªµÄ½Úµã£¬ÌáÉýËÑË÷ËÙ¶È¡£
Ëüͨ¹ý¿Õ¼äÀ´»»È¡Ê±¼ä¡£
Èç²éÕÒ19µÄ¹ý³Ì£º
ConcurrentSkipListSet
ËüÊÇÒ»¸öÓÐÐòµÄ¡¢Ḭ̈߳²È«µÄSet£¬Ï൱ÓÚḬ̈߳²È«µÄTreeSet¡£
ËüÄÚ²¿ÓµÓÐConcurrentSkipListMapʵÀý£¬±¾ÖÊÉϾÍÊÇÒ»¸öConcurrentSkipListMap£¬Ö»²»¹ý½öʹÓÃÁËMapÖеÄkey¡£
ArrayBlockingQueue
¸ÅÒª
ArrayBlockingQueueÊÇÒ»¸ö Êý×éʵÏÖµÄ Ḭ̈߳²È«µÄ ÓÐÏÞ ×èÈû¶ÓÁС£
Êý¾Ý½á¹¹

ArrayBlockingQueue¼Ì³Ð×ÔAbstractQueue£¬²¢ÊµÏÖÁËBlockingQueue½Ó¿Ú¡£
ArrayBlockingQueueÄÚ²¿ÓÉObjectÊý×é´æ´¢ÔªËØ£¬¹¹Ôìʱ±ØÐëÒªÖ¸¶¨¶ÓÁÐÈÝÁ¿¡£
ArrayBlockingQueueÓÉReentrantLockʵÏÖ¶ÓÁеĻ¥³â·ÃÎÊ£¬²¢ÓÉnotEmpty¡¢notFullÕâÁ½¸öCondition·Ö±ðʵÏÖ¶Ó¿Õ¡¢¶ÓÂúµÄ×èÈû¡£
ReentrantLock·ÖΪ¹«Æ½ËøºÍ·Ç¹«Æ½Ëø£¬¿ÉÒÔÔÚ¹¹ÔìArrayBlockingQueueʱָ¶¨¡£Ä¬ÈÏΪ·Ç¹«Æ½Ëø¡£
ÐÂÔöAPI
// ÔÚ¶ÓβÌí¼ÓÖ¸¶¨ÔªËØ£¬Èô¶ÓÒÑÂúÔòµÈ´ýÖ¸¶¨Ê±¼ä boolean offer(E e, long timeout, TimeUnit unit) // »ñÈ¡²¢É¾³ý¶ÓÊ×ÔªËØ£¬Èô¶ÓΪ¿ÕÔò×èÈûµÈ´ý E take() // Ìí¼ÓÖ¸¶¨ÔªËØ£¬Èô¶ÓÒÑÂúÔòÒ»Ö±µÈ´ý void put(E e) // »ñÈ¡¶ÓÊ×ÔªËØ£¬Èô¶ÓΪ¿Õ£¬ÔòµÈ´ýÖ¸¶¨Ê±¼ä E poll(long timeout, TimeUnit unit) |
¶ÓÂú¡¢¶Ó¿Õ×èÈû»½ÐѵÄÔÀí
¶ÓÂú×èÈû£ºµ±Ìí¼ÓÔªËØÊ±£¬Èô¶ÓÂú£¬Ôòµ÷ÓÃnotFull.await()×èÈûµ±Ç°Ị̈߳»µ±ÒƳýÒ»¸öÔªËØÊ±µ÷ÓÃnotFull.signal()»½ÐÑÔÚnotFullÉϵȴýµÄÏ̡߳£
¶Ó¿Õ×èÈû£ºµ±É¾³ýÔªËØÊ±£¬Èô¶ÓΪ¿Õ£¬Ôòµ÷ÓÃnotEmpty.await()×èÈûµ±Ç°Ị̈߳»µ±¶ÓÊ×Ìí¼ÓÔªËØÊ±£¬µ÷ÓÃnotEmpty.signal()»½ÐÑÔÚnotEmptyÉϵȴýµÄÏ̡߳£
LinkedBlockingQueue
¸ÅÒª
LinkedBlockingQueueÊÇÒ»¸ö µ¥Á´±íʵÏֵġ¢Ḭ̈߳²È«µÄ¡¢ÎÞÏÞ ×èÈû¶ÓÁС£
Êý¾Ý½á¹¹

LinkedBlockingQueue¼Ì³Ð×ÔAbstractQueue£¬ÊµÏÖÁËBlockingQueue½Ó¿Ú¡£
LinkedBlockingQueueÓɵ¥Á´±íʵÏÖ£¬Òò´ËÊǸöÎÞÏÞ¶ÓÁС£µ«ÎªÁË·½Ê½ÎÞÏÞÅòÕÍ£¬¹¹Ôìʱ¿ÉÒÔ¼ÓÉÏÈÝÁ¿¼ÓÒÔÏÞÖÆ¡£
LinkedBlockingQueue·Ö±ð²ÉÓöÁÈ¡ËøºÍ²åÈëËø¿ØÖƶÁÈ¡/ɾ³ý ºÍ ²åÈë¹ý³ÌµÄ²¢·¢·ÃÎÊ£¬²¢²ÉÓÃnotEmptyºÍnotFullÁ½¸öConditionʵÏÖ¶ÓÂú¶Ó¿ÕµÄ×èÈûÓ뻽ÐÑ¡£
¶ÓÂú¶Ó¿Õ×èÈû»½ÐѵÄÔÀí
¶ÓÂú×èÈû£ºÈôÒª²åÈëÔªËØ£¬Ê×ÏÈÐèÒª»ñÈ¡putLock£»ÔÚ´Ë»ù´¡ÉÏ£¬Èô´Ëʱ¶ÓÂú£¬Ôòµ÷ÓÃnotFull.await()£¬×èÈûµ±Ç°Ị̈߳»µ±ÒƳýÒ»¸öÔªËØºóµ÷ÓÃnotFull.signal()»½ÐÑÔÚnotFullÉϵȴýµÄỊ̈߳»×îºó£¬µ±²åÈë²Ù×÷Íê³ÉºóÊÍ·ÅputLock¡£
¶Ó¿Õ×èÈû£ºÈôҪɾ³ý/»ñÈ¡ÔªËØ£¬Ê×ÏÈÒª»ñÈ¡takeLock£»ÔÚ´Ë»ù´¡ÉÏ£¬Èô¶ÓΪ¿Õ£¬Ôòµ÷ÓÃnotEmpty.await()£¬×èÈûµ±Ç°Ị̈߳»µ±²åÈëÒ»¸öÔªËØºóµ÷ÓÃnotEmpty.signal()»½ÐÑÔÚnotEmptyÉϵȴýµÄỊ̈߳»×îºó£¬µ±É¾³ý²Ù×÷Íê³ÉºóÊÍ·ÅtakeLock¡£
PS£ºAPIºÍArrayBlockingQueueÒ»Ñù¡£
LinkedBlockingDeque
¸ÅÒª
ËüÊÇÒ»¸ö ÓÉË«ÏòÁ´±íʵÏֵġ¢Ḭ̈߳²È«µÄ¡¢ Ë«¶Ë ÎÞÏÞ ×èÈû¶ÓÁС£
Êý¾Ý½á¹¹

ConcurrentLinkedQueue
¸ÅÊö
ËüÊÇÒ»¸öÓɵ¥Á´±íʵÏֵġ¢Ḭ̈߳²È«µÄ¡¢ÎÞÏÞ ¶ÓÁС£
Êý¾Ý½á¹¹

Ëü½ö½ö¼Ì³ÐÁËAbstractQueue£¬²¢Î´ÊµÏÖBlockingQueue½Ó¿Ú£¬Òò´ËËü²»ÊÇ×èÈû¶ÓÁУ¬½ö½öÊǸöḬ̈߳²È«µÄÆÕͨ¶ÓÁС£
ÌØÐÔ
head¡¢tail¡¢next¡¢item¾ùʹÓÃvolatileÐÞÊΣ¬±£Ö¤ÆäÄÚ´æ¿É¼ûÐÔ£¬²¢Î´Ê¹ÓÃËø£¬´Ó¶øÌá¸ß²¢·¢Ð§ÂÊ¡£
PS£ºËü¾¿¾¹ÊÇÔõÑùÔÚ²»Ê¹ÓÃËøµÄÇé¿öÏÂʵÏÖḬ̈߳²È«µÄ£¿ |