## 1 ç®ä» CopyOnWriteArrayList å¨ JUC å ä¸ï¼æ¯æå¹¶åç Listï¼å®æ¯ä¸ª**线ç¨å®å ¨**ï¼è¯»æä½éè¿æ éç ArrayListï¼åæä½éè¿**å建åºå±æ°ç»å¯æ¬**ï¼æ¯ä¸ç§**读åå离**çå¹¶åçç¥ï¼ç§°è¿ç§å®¹å¨ä¸º"**åæ¶å¤å¶å¨**"ãç±äºè¿ä¸ªç¹æ§ï¼CopyOnWriteArrayList éç¨äº**读å¤åå°**çå¹¶ååºæ¯ã使¯ä¹æç¼ºç¹ï¼ä¸æ¯å åå ç¨ï¼æ¯æ¬¡åé½è¦åå»ºå¯æ¬ï¼äºæ¯æ æ³**ä¿è¯å®æ¶æ§**ã ## 2 æºç ### 2.1 add ```java public boolean add(E e) { //ä½¿ç¨ ReentrantLock å éï¼ä¿è¯çº¿ç¨å®å ¨ 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(); } } } ``` ### 2.2 remove ```java public E remove(int index) { //ä½¿ç¨ ReentrantLock å éï¼ä¿è¯çº¿ç¨å®å ¨ final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; E oldValue = get(elements, index); int numMoved = len - index - 1; if (numMoved == 0) //妿è¦å é¤çæ¯å表æ«ç«¯æ°æ®ï¼æ·è´ålen-1ä¸ªæ°æ®å°æ°å¯æ¬ä¸ï¼å忢å¼ç¨ setArray(Arrays.copyOf(elements, len - 1)); else { //å¦åï¼å°é¤è¦å é¤å ç´ ä¹å¤çå ¶ä»å ç´ æ·è´å°æ°å¯æ¬ä¸ï¼å¹¶åæ¢å¼ç¨ Object[] newElements = new Object[len - 1]; System.arraycopy(elements, 0, newElements, 0, index); System.arraycopy(elements, index + 1, newElements, index, numMoved); setArray(newElements); } return oldValue; } finally { //è§£é lock.unlock(); } } } ``` ### 2.3 get ```java //ç´æ¥è¯»åï¼æ éå é public E get(int index) { return get(getArray(), index); } private E get(Object[] a, int index) { return (E) a[index]; } ```