����λ�ã���ҳ > �����̳� > �̳� > Doug Lea��ʦ�ļ���CopyOnWriteArrayList���ò����ܿ����㣡

Doug Lea��ʦ�ļ���CopyOnWriteArrayList���ò����ܿ����㣡

��Դ������������|��ʱ�䣺2024-05-19 18:55:35 |���Ķ���162��|�� ��ǩ�� T wr COP ��ʦ Ri S C AR EA ug �� |����������

һ��д�ڿ�ͷ ������ѧϰ���ϻ���˵������ʱ���˽⵽���ܶ༯�ϲ����̰߳�ȫ�ģ��ڲ��������£�Ϊ�˱������ݵİ�ȫ�ԣ������˲�����������Ϊ��֪����ConcurrentHashMap��ConcurrentLinkedQueue��BlockingQueue�ȣ�������֪��ArrayListҲ���Լ���Ӧ�IJ�������

һ��д�ڿ�ͷ

������ѧϰ���ϻ���˵������ʱ���˽⵽���ܶ༯�ϲ����̰߳�ȫ�ģ��ڲ��������£�Ϊ�˱������ݵİ�ȫ�ԣ������˲�����������Ϊ��֪����ConcurrentHashMap��ConcurrentLinkedQueue��BlockingQueue�ȣ�������֪��ArrayListҲ���Լ���Ӧ�IJ��������

��Ϊʹ��Ƶ����ߵļ�����֮һ��ArrayList�̲߳���ȫ�������ڲ���������ʹ�ã�һ��Ҫ�����ֶ�����������ͨ��Collections.synchronizedList()תһ�֣�Ϊ�˽����һ���⣬Doug Lea������.������ʦΪ�����ṩ�����IJ����ࡪ�� CopyOnWriteArrayList ��

������֪CopyOnWriteArrayList

Doug Lea´óʦµÄ¼Ñ×÷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�룡

Doug Lea´óʦµÄ¼Ñ×÷CopyOnWriteArrayList£¬Óò»ºÃÄÜ¿ÓËÀÄ㣡

����ʵ�ִ������£���������ʵ�ֿ�ȥ����ƪ���¹�

@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�֮�

Doug Lea´óʦµÄ¼Ñ×÷CopyOnWriteArrayList£¬Óò»ºÃÄÜ¿ÓËÀÄ㣡

�塢�ܽ�

ͨ�����ϵ�ѧϰ�����ǽ����ܽ᣺CopyOnWriteArrayList���������ڿ��Ա�֤�̰߳�ȫ��ͬʱ��������������������������ڶ���д�ٵ������

��д����ٵ�����£�����д��Ķ���ռ�����ݽϴ�ʱ��������ʹ��CopyOnWriteArrayList��CopyOnWrite ����ֻ�ܱ�֤���ݵ�����һ���ԣ����ܱ�֤���ݵ�ʵʱһ���ԡ����������ϣ��д��ĵ����ݣ������ܶ������벻Ҫʹ�� CopyOnWrite ���������ͨ�� ReentrantReadWriteLock �Զ���һ�����б���

������β�ʵ�

�����ƪ���Ͷ�����һ���İ�������Ҽǵ� ����+����+�ղ� ѽ��ԭ�����ף�ת������ϵBuild�磡

С���Ƽ��Ķ�

�������������Ľ�Ϊ������Ϣ����������������ͬ���޹۵��֤ʵ��������

´óʦ 2.0.2.2
��ʦ 2.0.2.2
���ͣ�����ð��������Ӫ״̬����ʽ��Ӫ�������ԣ����� ����

��Ϸ����

��Ϸ���

��Ϸ��Ƶ

��Ϸ����

��Ϸ�

����ʦ������Ϸ��MagicBirdsUSInfo������һ��dz�����Ķ���ð����Ϸ��������Ϸ�Ϳ��Ի�õ�һ����װ��
´óʦºº»¯°æ 2.0.2
��ʦ������ 2.0.2
���ͣ�����ð��������Ӫ״̬����ʽ��Ӫ�������ԣ����� ����

��Ϸ����

��Ϸ���

��Ϸ��Ƶ

��Ϸ����

��Ϸ�

2018��3d��ս�����Ρ���ʦ���������Ƭ���������������ֻ���Ϸ�����ؼ��ɵõ�һ����װ�����콢���Ŷӵ�

�����Ƶ����

����

ͬ������

����

ɨ��ά�����������ֻ��汾��

ɨ��ά����������΢�Ź��ںţ�

��վ�������������������ϴ��������ַ���İ�Ȩ���뷢�ʼ�[email protected]

��ICP��2022002427��-10 �湫��������43070202000427��© 2013~2025 haote.com ������