首页 > 其他分享 >CopyOnWrite简单使用

CopyOnWrite简单使用

时间:2022-12-06 00:33:24浏览次数:40  
标签:java CopyOnWrite iterator 简单 list util add 使用 import

在集合遍历的时候,向集合中添加元素

这里的错误叫做fail-fast机制,当多个线程对同一集合的内容进行操作时,就可能会产生fail-fast事件

 

 

 

 当modCount的数量和expectedModCount的数量不一致时,就会抛出上面的异常

 

 集合元素添加产生异常的代码

package com.java.test.copyonwritearraylistdemo;

/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2022/12/2 15:34
 */
public class TestCopyOnWriteArrayList {

    public static void main(String[] args) {
        HelloThread h = new HelloThread();
        for (int i = 0; i < 10; i++) {
            new Thread(h).start();
        }
    }

}

  

package com.java.test.copyonwritearraylistdemo;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2022/12/2 15:35
 */
@Slf4j
public class HelloThread implements  Runnable {

    private static List<String> list = Collections.synchronizedList(new ArrayList<>());
    static {
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
    }

    @Override
    public void run() {

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            list.add(next+"123");
        }

    }
}

  引入CopyOnWriteArrayList

 

 

 

 不在使用modCount和ExpectModCount进行比较 

 代码改动部分

package com.java.test.copyonwritearraylistdemo;

import lombok.extern.slf4j.Slf4j;

import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2022/12/2 15:35
 */
@Slf4j
public class HelloThread implements  Runnable {

    private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
    static {
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
    }

    @Override
    public void run() {

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            list.add(next+"123");
        }

    }
}

  不过问题也很明显,适合读数据比较多,写数据比较少的情况,会产生数据一致性问题

 

 

 

 这里读取操作没有加锁,那么读数据就会很快,同时读取到的可能是老数据,而不是最新数据的原因

最后总结下优缺点

优点:读多写少性能优秀,线程安全读写分离

缺点:内存占用大,数据一致性问题

标签:java,CopyOnWrite,iterator,简单,list,util,add,使用,import
From: https://www.cnblogs.com/q202105271618/p/16951523.html

相关文章

  • [go-每日一库] go-gin项目使用realize实现代码、文件改动热更新
    之前用django编写web应用时,每次保存,django应用都是重新加载-热更新,最近在写gin应用,了解到golang常用的热更新可以用到fresh/gin/gowatch/bee/realize/air等,本文主要分享rea......
  • HTTP长连接、短连接使用及测试
    转自:https://blog.csdn.net/qq_36908872/article/details/127073610概念HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接。所以,下一次的HT......
  • 使用 gvm 来快速安装或者升级 golang 版本
    gvm是golang的版本管理工具,有点类似于python的pyenv。一、安装gvmbash<<(curl-s-S-Lhttps://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gv......
  • maven-dependency-plugin unpack 使用
    maven-dependency-plugin是一个比较有用,但是大家日常使用不是很多的插件,包含的功能解析依赖(显示依赖树,解析依赖的插件)copy依赖解压copy依赖(unpack比如需要部分jar......
  • element-ui 中upload组件与表单组件的结合使用
    背景有的时候我们需要在表单中携带一些上传的附件传给服务器搭建基本表单结构<template><div><el-form:model="ruleForm":rules="rules"r......
  • 服务器上kafka单机版安装以及shell简单测试
    在Kafka2.8之后,引入了基于Raft协议的KRaft模式,支持取消对Zookeeper的依赖。在此模式下,一部分KafkaBroker被指定为Controller,另一部分则为Broker。这些Controller的作用就......
  • Linux Debian11使用Podman安装DVWA靶场环境
    一、DVWA靶场环境简介​1.DVWA一个用来进行安全脆弱性鉴定的PHP/MySQLWeb应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用......
  • Qt(5.15) CMakeLists.txt简单介绍
    CMakeLists.txtcmake_minimum_required(VERSION3.5)指定cmake最低版本project(projectnameVERSION0.0.1LANGUAGESCXX)message("project_version:${CMAKE_PROJE......
  • Cmder简单配置
    右键加入:Cmder.exe/REGISTERALL解决中文乱码:找到Startup选项下的Environment,追加这些命令setPATH=%ConEmuBaseDir%\Scripts;%PATH%setLANG=zh_CN.UTF-8setLC_ALL=......
  • 使用pyusb读取USB设备的输入
    1importusb.core23dev=usb.core.find(idVendor=0x17ef,idProduct=0x600e)4ep=dev[0].interfaces()[0].endpoints()[0]567i=dev[0].interfaces......