thread37 - CopyOnWrite

package com.neutron.t22;

import java.util.*;
import java.util.concurrent.*;

/**
 *  写时复制容器 copy on write
 *  多线程环境下, 写时效率低,读时效率高
 *  适合写少读多的情况
 */
public class T222CopyOnWrite {

    /**
     * 测试什么内容?
     * 创建1个容器,开启10个线程,每个线程向容器内加入10000个数据,来测试不同容器的执行时间
     */
    public static void main(String[] args) {
        List<String> lists =
                 // new ArrayList<>();  // 并发会存在问题
                 // new Vector<>();     // 无并发问题,但是很慢
                 new CopyOnWriteArrayList<>();  // 没有并发问题,但是速度实在太慢

        Random r = new Random();
        Thread[] ths = new Thread[100];

        for (int i = 0; i < ths.length; i++) {
            ths[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    lists.add("l" + r.nextInt(1000));
                }
            });
        }
        runAndComputeTime(ths);

        /*
         使用ArrayList的执行结果,这是个错误的执行结果,目标应该是10w
         执行:161
         list size:98758
         -------------------------------------
         Vector和CopyOnWriteArrayList都没有问题
         */
        System.out.println("list size:" + lists.size());
    }

    static void runAndComputeTime(Thread[] ths){
        long start = System.currentTimeMillis();
        Arrays.asList(ths).forEach(Thread::start);
        Arrays.asList(ths).forEach((thread) -> {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值