±à¼ÍƼö: |
ÎÄÕÂÖ÷Òª½éÉÜConcurrentHashMapµ×²ã¾ßÌåʵÏÖ£¬·Ö¶ÎËø£¬µ×²ã²ÉÓã¬HashTableÈ«±íËøµÈµÈ£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚitpub£¬ÓÉ»ðÁú¹ûÈí¼þDelores±à¼¡¢ÍƼö¡£ |
|
ConcurrentHashMapConcurrentHashMapµ×²ã¾ßÌåʵÏÖJDK 1.7µ×²ãʵÏÖ½«Êý¾Ý·ÖΪһ¶ÎÒ»¶ÎµÄ´æ´¢£¬È»ºó¸øÃ¿Ò»¶ÎÊý¾ÝÅäÒ»°ÑËø£¬ µ±Ò»¸öÏß³ÌÕ¼ÓÃËø·ÃÎÊÆäÖÐÒ»¸ö¶ÎÊý¾Ýʱ£¬ÆäËû¶ÎµÄÊý¾ÝÒ²Äܱ»ÆäËûÏ̷߳ÃÎÊ¡£ConcurrentHashMapÊÇÓÉSegmentÊý×é½á¹¹ºÍHashEntryÊý×é½á¹¹×é³É¡£ ÆäÖÐSegment ʵÏÖÁË ReentrantLock,ËùÒÔSegmentÊÇÒ»
ConcurrentHashMap
ConcurrentHashMapµ×²ã¾ßÌåʵÏÖ
JDK 1.7µ×²ãʵÏÖ

½«Êý¾Ý·ÖΪһ¶ÎÒ»¶ÎµÄ´æ´¢£¬È»ºó¸øÃ¿Ò»¶ÎÊý¾ÝÅäÒ»°ÑËø£¬ µ±Ò»¸öÏß³ÌÕ¼ÓÃËø·ÃÎÊÆäÖÐÒ»¸ö¶ÎÊý¾Ýʱ£¬ÆäËû¶ÎµÄÊý¾ÝÒ²Äܱ»ÆäËûÏ̷߳ÃÎÊ¡£
ConcurrentHashMapÊÇÓÉ SegmentÊý×é½á¹¹ ºÍ HashEntryÊý×é½á¹¹ ×é³É¡£ ÆäÖÐSegment ʵÏÖÁË ReentrantLock,ËùÒÔ SegmentÊÇÒ»ÖÖ¿ÉÖØÈëËø £¬°çÑÝËøµÄ½ÇÉ«¡£ HashEntry ÓÃÓÚ´æ´¢¼üÖµ¶ÔÊý¾Ý¡£
Ò»¸öConcurrentHashMapÀï°üº¬Ò»¸öSegmentÊý×é¡£ Segment½á¹¹ºÍHashMapÀàËÆ £¬ÊÇÒ»ÖÖÊý×éºÍÁ´±í½á¹¹£¬ Ò»¸öSegment°üº¬Ò»¸öHashEntryÊý×飬ÿ¸öHashEntryÊÇÒ»¸öÁ´±í½á¹¹µÄÔªËØ£¬ ÿ¸öSegmentÊØ»¤×ÅÒ»¸öHashEntryÊý×éÀïµÄÔªËØ£¬µ±¶ÔHashEntryÊý×éµÄÊý¾Ý½øÐÐÐÞ¸Äʱ£¬±ØÐëÊ×ÏÈ»ñµÃ¶ÔÓ¦µÄSegmentµÄËø¡£
JDK 1.8µ×²ãʵÏÖ
TreeBin: ºìºÚ¶þ²æÊ÷½Úµã Node: Á´±í½Úµã

ConcurrentHashMapÈ¡ÏûÁËSegment·Ö¶ÎËø£¬ ²ÉÓÃCASºÍsynchronizedÀ´±£Ö¤²¢·¢°²È« ¡£ Êý¾Ý½á¹¹ÓëHashMap1.8µÄ½á¹¹ÀàËÆ£¬Êý×é+Á´±í/ºìºÚ¶þ²æÊ÷(Á´±í³¤¶È>8ʱ£¬×ª»»ÎªºìºÚÊ÷)¡£
synchronizedÖ»Ëø¶¨µ±Ç°Á´±í»òºìºÚ¶þ²æÊ÷µÄÊ׽ڵ㣬ÕâÑùÖ»Òª hashÖµ²»³åÍ»£¬¾Í²»»á²úÉú²¢·¢ ¡£
ConcurrentHashMapºÍHashtableµÄÇø±ð
µ×²ãÊý¾Ý½á¹¹£º
JDK1.7 µÄConcurrentHashMapµ×²ã²ÉÓÃ
·Ö¶ÎµÄÊý×é+Á´±í
ʵÏÖ£¬ JDK1.8 µÄConcurrentHashMapµ×²ã²ÉÓõÄÊý¾Ý½á¹¹ÓëJDK1.8 µÄHashMapµÄ½á¹¹Ò»Ñù£¬
Êý×é+Á´±í/ºìºÚ¶þ²æÊ÷
¡£
HashtableºÍJDK1.8 ֮ǰµÄHashMapµÄµ×²ãÊý¾Ý½á¹¹ÀàËÆ¶¼ÊDzÉÓÃ
Êý×é+Á´±í
µÄÐÎʽ£¬ Êý×éÊÇ HashMap µÄÖ÷Ì壬Á´±íÔòÊÇÖ÷ҪΪÁ˽â¾ö¹þÏ£³åÍ»¶ø´æÔÚµÄ
ʵÏÖḬ̈߳²È«µÄ·½Ê½
JDK1.7µÄConcurrentHashMap£¨·Ö¶ÎËø£©¶ÔÕû¸öͰÊý×é½øÐÐÁË·Ö¸î·Ö¶Î(Segment)£¬ ÿһ°ÑËøÖ»ËøÈÝÆ÷ÆäÖÐÒ»²¿·ÖÊý¾Ý£¬¶àÏ̷߳ÃÎÊÈÝÆ÷ÀﲻͬÊý¾Ý¶ÎµÄÊý¾Ý£¬¾Í²»»á´æÔÚËø¾ºÕù£¬Ìá¸ß²¢·¢·ÃÎÊÂÊ¡£ JDK 1.8 ²ÉÓÃ
Êý×é+Á´±í/ºìºÚ¶þ²æÊ÷
µÄÊý¾Ý½á¹¹À´ÊµÏÖ£¬²¢·¢¿ØÖÆÊ¹ÓÃ
synchronizedºÍCAS
À´²Ù×÷¡£
Hashtable:ʹÓà synchronized À´±£Ö¤Ḭ̈߳²È«£¬Ð§Âʷdz£µÍÏ¡£ µ±Ò»¸öÏ̷߳ÃÎÊͬ²½·½·¨Ê±£¬ÆäËûÏß³ÌÒ²·ÃÎÊͬ²½·½·¨£¬¿ÉÄÜ»á½øÈë×èÈû»òÂÖѯ״̬£¬ ÈçʹÓà put Ìí¼ÓÔªËØ£¬ÁíÒ»¸öÏ̲߳»ÄÜʹÓà put Ìí¼ÓÔªËØ£¬Ò²²»ÄÜʹÓà get£¬¾ºÕù»áÔ½À´Ô½¼¤ÁÒ¡£
HashTableÈ«±íËø

ConcurrentHashMap·Ö¶ÎËø

CopyOnWriteArrayList
public class
CopyOnWriteArrayList <E> extends Object
implements List<E>, RandomAccess, Cloneable,
Serializable |
ÔںܶàÓ¦Óó¡¾°ÖУ¬¶Á²Ù×÷¿ÉÄÜ»áÔ¶Ô¶´óÓÚд²Ù×÷¡£ ÓÉÓÚ¶Á²Ù×÷¸ù±¾²»»áÐÞ¸ÄÔÓеÄÊý¾Ý£¬Òò´Ë¶ÔÓÚÿ´Î¶ÁÈ¡¶¼½øÐмÓËøÆäʵÊÇÒ»ÖÖ×ÊÔ´ÀË·Ñ¡£ ÎÒÃÇÓ¦¸ÃÔÊÐí¶à¸öÏß³Ìͬʱ·ÃÎÊListµÄÄÚ²¿Êý¾Ý£¬±Ï¾¹¶ÁÈ¡²Ù×÷Êǰ²È«µÄ¡£ ÕâºÍReentrantReadWriteLock¶ÁÐ´ËøµÄ˼Ïë·Ç³£ÀàËÆ£¬Ò²¾ÍÊǶÁ¶Á¹²Ïí¡¢Ð´Ð´»¥³â¡¢¶Áд»¥³â¡¢Ð´¶Á»¥³â¡£ JDKÖÐÌṩÁËCopyOnWriteArrayListÀà±ÈÏà±ÈÓÚÔÚ¶ÁÐ´ËøµÄ˼ÏëÓÖ¸ü½øÒ»²½¡£ ΪÁ˽«¶ÁÈ¡µÄÐÔÄÜ·¢»Óµ½¼«Ö£¬ CopyOnWriteArrayList ¶ÁÈ¡ÊÇÍêÈ«²»ÓüÓËøµÄ£¬²¢ÇÒдÈëÒ²²»»á×èÈû¶ÁÈ¡²Ù×÷ ¡£ Ö»ÓÐдÈëºÍдÈëÖ®¼äÐèÒª½øÐÐͬ²½µÈ´ý¡£ÕâÑù£¬¶Á²Ù×÷µÄÐÔÄܾͻá´ó·ù¶ÈÌá¸ß¡£
CopyOnWriteArrayListµÄʵÏÖ»úÖÆ
CopyOnWriteArrayLis ÀàµÄËùÓпɱä²Ù×÷£¨add£¬setµÈµÈ£©¶¼ÊÇͨ¹ý ´´½¨µ×²ãÊý×éµÄи±±¾ À´ÊµÏֵġ£ µ± List ÐèÒª±»Ð޸ĵÄʱºò£¬ÎÒ²¢²»ÐÞ¸ÄÔÓÐÄÚÈÝ£¬¶øÊǶÔÔÓÐÊý¾Ý½øÐÐÒ»´Î¸´ÖÆ£¬½«Ð޸ĵÄÄÚÈÝдÈ븱±¾¡£ дÍêÖ®ºó£¬ÔÙ½«ÐÞ¸ÄÍêµÄ¸±±¾Ìæ»»ÔÀ´µÄÊý¾Ý£¬ÕâÑù¾Í¿ÉÒÔ ±£Ö¤Ð´²Ù×÷²»»áÓ°Ïì¶Á²Ù×÷ ÁË¡£
CopyOnWriteArrayListÊÇÂú×ãCopyOnWriteµÄArrayList£¬ ËùνCopyOnWriteÒ²¾ÍÊÇ˵£º ÔÚ¼ÆËã»ú£¬Èç¹ûÄãÏëÒª¶ÔÒ»¿éÄÚ´æ½øÐÐÐÞ¸Äʱ£¬ÎÒÃDz»ÔÚÔÓÐÄÚ´æ¿éÖнøÐÐд²Ù×÷£¬ ¶øÊǽ«Äڴ濽±´Ò»·Ý£¬ÔÚеÄÄÚ´æÖнøÐÐд²Ù×÷£¬Ð´ÍêÖ®ºóÄØ£¬¾Í½«Ö¸ÏòÔÀ´ÄÚ´æÖ¸ÕëÖ¸ÏòеÄÄڴ棬 ÔÀ´µÄÄÚ´æ¾Í¿ÉÒÔ±»»ØÊÕµôÁË¡£
CopyOnWriteArrayList¶ÁÈ¡ºÍдÈëÔ´Âë¼òµ¥·ÖÎö
CopyOnWriteArrayList¶ÁÈ¡²Ù×÷µÄʵÏÖ
¶ÁÈ¡²Ù×÷ûÓÐÈκÎͬ²½¿ØÖƺÍËø²Ù×÷£¬ ÒòΪÄÚ²¿Êý×éarray²»»á·¢ÉúÐ޸ģ¬Ö»»á±»ÁíÍâÒ»¸öarrayÌæ»»£¬Òò´Ë¿ÉÒÔ±£Ö¤Êý¾Ý°²È«¡£
/** The array,
accessed only via getArray/setArray. */
private transient volatile Object[] array;
public E get(int index) {
return get(getArray(), index);
}
@SuppressWarnings("unchecked")
private E get (Object[] a, int index) {
return (E) a[index];
}
final Object[] getArray() {
return array;
} |
CopyOnWriteArrayList¶ÁÈ¡²Ù×÷µÄʵÏÖ
CopyOnWriteArrayList дÈë²Ù×÷ add() ·½·¨ÔÚÌí¼Ó¼¯ºÏµÄʱºò¼ÓÁËËø£¬ ±£Ö¤Í¬²½£¬±ÜÃâÁ˶àÏß³ÌдµÄʱºò»á¸´ÖƳö¶à¸ö¸±±¾³öÀ´ ¡£
/**
* Appends the specified element to the end of
this list.
*/
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();//¼ÓËø
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements,
len + 1); //¿½±´ÐÂÊý×é
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();//ÊÍ·ÅËø
}
} |
ConcurrentLinkedQueue
JavaÌṩµÄḬ̈߳²È«µÄ Queue ¿ÉÒÔ·ÖΪ×èÈû¶ÓÁкͷÇ×èÈû¶ÓÁУ¬ÆäÖÐ×èÈû¶ÓÁеĵäÐÍÀý×ÓÊÇ BlockingQueue£¬ ·Ç×èÈû¶ÓÁеĵäÐÍÀý×ÓÊÇConcurrentLinkedQueue£¬ÔÚʵ¼ÊÓ¦ÓÃÖÐÒª¸ù¾Ýʵ¼ÊÐèҪѡÓÃ×èÈû¶ÓÁлòÕß·Ç×èÈû¶ÓÁС£ ×èÈû¶ÓÁпÉÒÔͨ¹ý¼ÓËøÀ´ÊµÏÖ£¬·Ç×èÈû¶ÓÁпÉÒÔ Í¨¹ýCAS²Ù×÷ ʵÏÖ¡£
ConcurrentLinkedQueueʹÓà Á´±í ×÷ΪÆäÊý¾Ý½á¹¹¡£ ConcurrentLinkedQueueÓ¦¸ÃËãÊÇÔڸ߲¢·¢»·¾³ÖÐÐÔÄÜ×îºÃµÄ¶ÓÁÐÁË¡£ ËüÖ®ËùÓÐÄÜÓкܺõÄÐÔÄÜ£¬ÊÇÒòΪÆäÄÚ²¿¸´ÔÓµÄʵÏÖ¡£
ConcurrentLinkedQueue Ö÷Òª ʹÓÃCAS·Ç×èÈûËã·¨À´ÊµÏÖḬ̈߳²È« ¡£ ÊʺÏÔÚ¶ÔÐÔÄÜÒªÇóÏà¶Ô½Ï¸ß£¬¶Ô¸öÏß³Ìͬʱ¶Ô¶ÓÁнøÐжÁдµÄ³¡¾°£¬ ¼´Èç¹û¶Ô¶ÓÁмÓËøµÄ³É±¾½Ï¸ßÔòÊʺÏʹÓÃÎÞËøµÄConcurrentLinkedQueueÀ´Ìæ´ú¡£
BlockingQueue
java.util.concurrent.BlockingQueue ½Ó¿ÚÓÐÒÔÏÂ×èÈû¶ÓÁеÄʵÏÖ£º
FIFO ¶ÓÁÐ £ºLinkedBlockingQueue¡¢ArrayBlockingQueue£¨¹Ì¶¨³¤¶È£©
ÓÅÏȼ¶¶ÓÁÐ £ºPriorityBlockingQueue
ÌṩÁË×èÈûµÄ take() ºÍ put() ·½·¨£ºÈç¹û¶ÓÁÐΪ¿Õ take() ½«×èÈû£¬Ö±µ½¶ÓÁÐÖÐÓÐÄÚÈÝ£» Èç¹û¶ÓÁÐΪÂú put() ½«×èÈû£¬Ö±µ½¶ÓÁÐÓпÕÏÐλÖá£
ʹÓà BlockingQueue ʵÏÖÉú²úÕßÏû·ÑÕßÎÊÌâ
public class
ProducerConsumer{
private static BlockingQueue <String> queue
= new ArrayBlockingQueue<>(5);
private static class Producer extends Thread {
@Override
public void run() {
try {
queue.put("product");
} catch (InterruptedException e){
e.printStackTrace();
}
System.out.print("produce..");
}
}
private static class Consumer extends Thread {
@Override
public void run() {
try {
String product = queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print("consume..");
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
Producer producer = new Producer();
producer.start();
}
for (int i = 0; i < 5; i++) {
Consumer consumer = new Consumer();
consumer.start();
}
for (int i = 0; i < 3; i++) {
Producer producer = new Producer();
producer.start();
}
}
produce..produce..consume..consume.. produce..consume..produce.. consume..produce..consume.. |
|