Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Java²¢·¢ÈÝÆ÷£¬µ×²ãÔ­ÀíÉîÈë·ÖÎö
 
×÷Õߣºlihong
  2582  次浏览      29
 2019-12-4
 
±à¼­ÍƼö:
ÎÄÕÂÖ÷Òª½éÉÜ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..
 
   
2582 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö