当前位置: 首页 > news >正文

【Java】CopyOnWriteArrayList

一,概述

CopyOnWriteArrayList作为List接口的实现之一,它区分于ArrayList在于它是线程安全的。如它名字一样,所有的写操作均复制了原数组的值,虽说代价较大,但读多写少的环境下,是可接受的。笔者在此简单看下实现原理。

二,实例

三,实现

承载数据存储的数组,便是array成员,其声明了volatile,让其具备原子性、可见性,

1,add

2,get

读是无锁操作,因为写操作仅会复制array,不会对读产生任何影响,这是重点,

且array声明了volatile,写操作完毕后,是可直接拿到已经改变的array。

3,set

set通过clone方式,创建一个副本

4,iter

设计模式中行为性迭代器设计模式,此处当然必不可少,

hasNext,next均无锁操作,

CopyOnWriteArrayList#Iter是不支持remove,set,add方法实现,毕竟遍历此List,只在读的情况下。并且在iter期间,突然的写操作,是无法影响此Iter,毕竟已经存了snapshot,写操作的array已经是新值。换句话说,Iter后,不管原CopyOnWriteArrayList内部值如何变化,均不会影响此Iter,snapshot已经独立。

http://www.dtcms.com/a/231090.html

相关文章:

  • 【OSG学习笔记】Day 15: 路径动画与相机漫游
  • 结构性设计模式之Facade(外观)设计模式
  • 【二分图 图论】P9384 [THUPC 2023 决赛] 着色|普及+
  • SpringAI(GA):Nacos2下的分布式MCP
  • vue 打包报错 Cannot find module ‘@vue/cli-plugin-babel/preset‘ - thread-loader
  • vue-16(Vuex 中的模块)
  • 2025年渗透测试面试题总结-腾讯[实习]安全研究员(题目+回答)
  • IEEE ICBCTIS 2025 会议征稿:探索区块链与信息安全的前沿学术之旅​
  • 学习STC51单片机27(芯片为STC89C52RCRC)
  • PageHelper-分页插件
  • PaddleOCR(2):PaddleOCR环境搭建
  • 文本内容变化引起布局尺寸变化 导致的 UI 适配问题
  • DuckDB + Spring Boot + MyBatis 构建高性能本地数据分析引擎
  • day 44
  • 深入解析FutureTask:原理与实战
  • 【从0-1的HTML】第3篇:html引入css的3种方式
  • Golang——7、包与接口详解
  • Redisson - 实现延迟队列
  • DAY43 复习日
  • 压测软件-Jmeter
  • MySQL 9.0 相较于 MySQL 8.0 引入了多项重要改进和新特性
  • 机器学习基础(四) 决策树
  • 时序数据库IoTDB与EdgeX Foundry集成适配服务介绍
  • 记一次运行spark报错
  • 使用 Ansys Q3D 进行电容提取
  • 离散化思想
  • C++初阶 | 模板
  • 黑枸杞成分对抗结肠炎:微生物组学视角下的新发现与突破
  • matlab实现高斯烟羽模型算法
  • 【C语言】通用统计数据结构及其更新函数(最值、变化量、总和、平均数、方差等)