- java.util.concurrent java并发编程包
CopyOnWriteArrayList
package syn;
import java.util.concurrent.CopyOnWriteArrayList;
public class testJUC {
public static void main(String[] args) {
CopyOnWriteArrayList<String > lists = new CopyOnWriteArrayList<>();
for (int i = 0; i < 10000; i++) {
new Thread(()->{lists.add(Thread.currentThread().getName());}).start();
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(lists.size());
}
}
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();
}
}
- 可以看到add方法是通过加ReentrantLock锁来保证并发操作,通过拷贝一个新数组,在新数组来操作加入数据
- ReentrantLock 锁是可重复进入独占锁,一段时间内只允许一个线程进入,必须手动释放锁。
- 【注】: synchronized 与lock的对比
- Lock显示锁(手动开启关闭),synchronized 是隐式锁,出了作用域自动释放
- Lock只有代码块锁,synchronized 有代码块锁和方法锁
- Lock锁,JVM将花费较少的时间调度线程,性能更好