����λ�ã���ҳ > �����̳� > �̳� > Doug Lea��ʦ�ļ���CopyOnWriteArrayList���ò����ܿ����㣡
һ��д�ڿ�ͷ ������ѧϰ���ϻ���˵������ʱ���˽⵽���ܶ༯�ϲ����̰߳�ȫ�ģ��ڲ��������£�Ϊ�˱������ݵİ�ȫ�ԣ������˲�����������Ϊ��֪����ConcurrentHashMap��ConcurrentLinkedQueue��BlockingQueue�ȣ�������֪��ArrayListҲ���Լ���Ӧ�IJ�������
������ѧϰ���ϻ���˵������ʱ���˽⵽���ܶ༯�ϲ����̰߳�ȫ�ģ��ڲ��������£�Ϊ�˱������ݵİ�ȫ�ԣ������˲�����������Ϊ��֪����ConcurrentHashMap��ConcurrentLinkedQueue��BlockingQueue�ȣ�������֪��ArrayListҲ���Լ���Ӧ�IJ��������
��Ϊʹ��Ƶ����ߵļ�����֮һ��ArrayList�̲߳���ȫ�������ڲ���������ʹ�ã�һ��Ҫ�����ֶ�����������ͨ��Collections.synchronizedList()תһ�֣�Ϊ�˽����һ���⣬Doug Lea������.������ʦΪ�����ṩ�����IJ����ࡪ��
CopyOnWriteArrayList
��
CopyOnWriteArrayList ��java.util.concurrent�IJ����࣬�̰߳�ȫ����Ñдʱ���Ƶ�Ô��CopyOnWrite����ʲô��˼�أ����������ڶ��б�������ɾ��ʱ�����ȴ���һ���б��ĸ������ڸ����������ɾ�IJ������ٽ������滻Ô�б����������̾ɵ��б���û�����������Ô���Ķ�ȡ�����Կɼ�����
��������ϸ�ĵ�ͬѧӦ���Ѿ����������ġ��׶ˡ��ˣ��ȸ�ֵ������д�����滻��������ʱ���ģ�û���������CopyOnWrite����ʱ���²��ԣ������ڷ���д��ͬʱ����������������ȡ��ֻ�Ǿ��б��е����ݣ�ֱ�������滻��ɣ����Ա�֤ ���ݵ�����һ���� ���޷���֤ʵʱ�ԡ�
��������һ��CopyOnWriteArrayList�ײ��Դ��ʵ�֣��������ڲ�ά����һ�����飬��volatile�ؼ������Σ���֤�����ݵ��ڴ�ɼ���
/** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array;
��ȡ��get()����
public E get(int index) {
return get(getArray(), index);
}
/**
* Gets the array. Non-private so as to also be accessible
* from CopyOnWriteArraySet class.
*/
final Object[] getArray() {
return array;
}
private E get(Object[] a, int index) {
return (E) a[index];
}
���Դ��ûʲô���ܺ����⣬������ͨ�Ķ�ȡ����IJ�������Ҳ�ܿ���CopyOnWriteArrayList�Ķ��Dz������ġ�
������add()����
public boolean add(E e) {
final ReentrantLock lock = this.lock;
//1. ʹ��Lock,��֤д�߳���ͬһʱ��ֻ��һ��
lock.lock();
try {
//2. ��ȡ����������
Object[] elements = getArray();
int len = elements.length;
//3. �����µ����飬��������������ݸ��Ƶ���������
Object[] newElements = Arrays.copyOf(elements, len + 1);
//4. ���������������µ�����
newElements[len] = e;
//5. ������������ָ���µ�����
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
final void setArray(Object[] a) {
array = a;
}
ͨ�����Դ�룬���Ǿ��ܹ���֪��ǰ��������ʵ��Ô���ˣ� ���� ������Ԫ��ʱ���ڲ�ͨ��������������������˵��дʱ���ռ�� Ȼ�� ���ٽ�Ô���鸳ֵ��һ���������У� ��� ���������������ָ�������顣
����CopyOnWriteArrayList���ճ�ʹ�ã���ArrayList����һģһ����������Ͳ��ù�������ˣ�������ʹ�û�����Ҫע��ģ���Ȼ���Ա�֤�̰߳�ȫ���������������£�����Ӧ�ڶ���д�ٵIJ�������������Ƶ��д�����д��Ķ���ϴ�һ����Ҫʹ��CopyOnWriteArrayList��������Ȼ�������ģ�
���ٸ����ӡ�
֮ǰ����ƪ�����У�[EasyExcel���뵼������������]
������CopyOnWriteArrayList���Դ�����֤�ڶ��߳�д�����ݿ�ʱ���̰߳�ȫ������д���excel�ļ�����100������������ٵ����ʱ��dz�֮��������514�룡
����ʵ�ִ������£���������ʵ�ֿ�ȥ����ƪ���¹�
@Slf4j
@Service
public class EasyExcelImportHandler implements ReadListener {
/*�ɹ�����*/
private final CopyOnWriteArrayList successList = new CopyOnWriteArrayList<>();
/*���������*/
private final static int BATCH_COUNT = 20000;
@Resource
private ThreadPoolExecutor threadPoolExecutor;
@Resource
private UserMapper userMapper;
@Override
public void invoke(User user, AnalysisContext analysisContext) {
if(StringUtils.isNotBlank(user.getName())){
successList.add(user);
return;
}
if(successList.size() >= BATCH_COUNT){
log.info("��ȡ���ݣ�{}", successList.size());
saveData();
}
}
/**
* ���ö��̶߳�ȡ����
*/
private void saveData() {
List> lists = ListUtil.split(successList, 20000);
CountDownLatch countDownLatch = new CountDownLatch(lists.size());
for (List list : lists) {
threadPoolExecutor.execute(()->{
try {
userMapper.insertSelective(list.stream().map(o -> {
User user = new User();
user.setName(o.getName());
user.setId(o.getId());
user.setPhoneNum(o.getPhoneNum());
user.setAddress(o.getAddress());
return user;
}).collect(Collectors.toList()));
} catch (Exception e) {
log.error("�����߳�ʧ��,e:{}", e.getMessage(), e);
} finally {
//ִ����һ���̼߳�1,ֱ��ִ����
countDownLatch.countDown();
}
});
}
// �ȴ������߳�ִ����
try {
countDownLatch.await();
} catch (Exception e) {
log.error("�ȴ������߳�ִ�����쳣,e:{}", e.getMessage(), e);
}
// ��ǰ������ʹ�õļ�����գ��ͷ���Դ
successList.clear();
lists.clear();
}
/**
* �������ݶ�ȡ���֮�����
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//��ȡʣ������
if(CollectionUtils.isNotEmpty(successList)){
log.info("��ȡ���ݣ�{}��",successList.size());
saveData();
}
}
}
������δ����е�CopyOnWriteArrayList��ΪArrayList��
/*�ɹ�����*/
// private final CopyOnWriteArrayList successList = new CopyOnWriteArrayList<>();
private final List successList = new ArrayList<>();
����100���������ĺ�ʱ��ֱ�Ӵӷ��ӽ�Ϊ�뼶���ɴ˿ɼ�CopyOnWriteArrayList��д������ʱ�����ܷdz�֮�
ͨ�����ϵ�ѧϰ�����ǽ����ܽ᣺CopyOnWriteArrayList���������ڿ��Ա�֤�̰߳�ȫ��ͬʱ��������������������������ڶ���д�ٵ������
��д����ٵ�����£�����д��Ķ���ռ�����ݽϴ�ʱ��������ʹ��CopyOnWriteArrayList��CopyOnWrite ����ֻ�ܱ�֤���ݵ�����һ���ԣ����ܱ�֤���ݵ�ʵʱһ���ԡ����������ϣ��д��ĵ����ݣ������ܶ������벻Ҫʹ�� CopyOnWrite ���������ͨ�� ReentrantReadWriteLock �Զ���һ�����б���
�����ƪ���Ͷ�����һ���İ�������Ҽǵ� ����+����+�ղ� ѽ��Ô�����ף�ת������ϵBuild�磡
ʹ��Blender���ɳ���ģ��
�Ķ�ȫ����������ERA5�����ط���
�Ķ�Xpath���������﷨
�Ķ�����ѧϰ�������繹�����£�
�Ķ���ΪMateƷ��ʢ�䣺HarmonyOS NEXT�ӳ�����Ϸ���ܵõ�����ͷ�
�Ķ�ʵ�ֶ��󼯺���DataTable���໥ת��
�Ķ�Ӳ�̵Ļ���֪ʶ��ѡ��ָ��
�Ķ�������й��ƶ��ı�ͼ��ײ�
�Ķ�����NEXTԪ�����������ѿ����ϼ���Ʒ
�Ķ��ᳲ���С������������Ƽ��رշ���
�Ķ������ArcMap�����н���դ��ͼ���ز�������
�Ķ��㷨�����ݽṹ 1 - ģ��
�Ķ���Ѷ�����߿ͷ���Ӫ��ϵͳ����
�Ķ���Ѷ��Ƶҹ��ģʽ���ý̳�
�Ķ����ں���NEXT��Ѫ���Ŵ���������������
�Ķ�5. Spring Cloud OpenFeign ����ʽ WebService �ͻ��˵ij���ϸʹ��
�Ķ�Java����ģʽ����̬�����Ͷ�̬�����ĶԱȷ���
�Ķ�Win11�ʼDZ����Զ�����Ӧ�õ���ɫ����ʾ����
�Ķ�˼�� V1.5.6 ��׿��
��ս�귨 V7.5.0 ��׿��
У��������������׵������� V1.0 ��׿��
��˸֮�� V1.9.7 ��׿��
������Ե����� v1.0.4 ��׿��
������֮ŠV5.2.3 ��׿��
��������������Դ V1.0 ��׿��
���֮Ϣ V1.0 ��׿��
��ħ������������䣩 V1.0 ��׿��
���ں�������ϵ�����������������վ�����������������Ƽ�����
Ƶ�� ����Ƶ��������ר������������׿�������app����
�Ƽ� ��Ô���������°��������ܿ������ز���
���� ����ɫ������������ ���������ս������������
ɨ��ά�����������ֻ��汾��
ɨ��ά����������΢�Ź��ںţ�
��վ�������������������ϴ��������ַ���İ�Ȩ���뷢�ʼ�[email protected]
��ICP��2022002427��-10 �湫��������43070202000427��© 2013~2025 haote.com ������