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

河北省建设执业资格中心网站seo经验是什么

河北省建设执业资格中心网站,seo经验是什么,运营推广策略有哪些,oss如何做网站一、CopyOnWriteArrayList 源码解读 在 JUC 中,对于 ArrayList 的线程安全用法,比较推崇于使用 CopyOnWriteArrayList ,那 CopyOnWriteArrayList是怎么解决线程安全问题的呢,本文带领大家一起解读下 CopyOnWriteArrayList 的源码…

一、CopyOnWriteArrayList 源码解读

JUC 中,对于 ArrayList 的线程安全用法,比较推崇于使用 CopyOnWriteArrayList ,那 CopyOnWriteArrayList是怎么解决线程安全问题的呢,本文带领大家一起解读下 CopyOnWriteArrayList 的源码,主要对几个常用的函数进行讲解。

在进行 CopyOnWriteArrayList 的源码讲解之前,先看下同样实现了线程安全的 Vector ,很多文章都说不推荐使用 Vector ,其主要原因是性能太差了,那性能为什么这么差呢?可以看下 Vector addget 的源码:

在这里插入图片描述
在这里插入图片描述

Vector 的添加和读取操作都被加上了 synchronized 锁,当并发情况下,因为锁的存在相当于变成了单线程的操作,所以效率肯定低,同样这样的优点就是保证了数据的唯一性,不会读取到脏数据。

下面再看下 CopyOnWriteArrayList 是如何解决并发问题的呢。

首先看下 CopyOnWriteArrayList 的全局变量有哪些:

在这里插入图片描述

其中 lock 锁就是每次在做写操作时,锁的句柄,array 就是具体存储数据的数组,注意这里的 arrayvolatile 所修饰,因此可以在并发情况下实现数据的可见性。

new 创建了一个 CopyOnWriteArrayList 时,如果是使用无参的构造函数,则将 array 的长度默认成 0 ,创建了一个空的数组。

在这里插入图片描述
在这里插入图片描述

在使用 add 添加数据时,先使用 lock 上锁,并获取到当前的 array 数组,然后对 array 进行 copyOf,新的数组的长度是之前的长度 +1 ,这样才能存放当前新的值,将新值填充后,再替换掉旧的 array 数组后,释放当前锁。

在这里插入图片描述

在使用 get 获取指定下边数据时,直接对当前的 array 进行操作:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在进行 remove 删除时,先使用 lock 上锁,然后再获取当前的 array 数组,如果传入的 index 正好是最后一个,那么 numMoved 计算出来就是 0 ,则使用 copyOf ,长度进行 -1 去除最后一个数据。否则传入的不是最后一个,先声明一个新的 array 数组,数组的长度就是旧的 arraylen - 1,再将 0index 的数据 arraycopy 至新的 array 数组,然后再将 index + 1 后的再 arraycopy 至新的 array 数组,最后将新的 array 数组替换旧的,然后释放锁。

在这里插入图片描述

二、总结

  1. new 新建一个 CopyOnWriteArrayList 后会生成一个数组 array 来存放添加的内容,如果是无参的构造函数,则 array 的长度为 0 ,添加数据时再进行扩容。同时会声明一个 ReentrantLock 锁。
  2. 当进行 add 操作时,先进行上锁,然后对当前的 array 进行 copyOf,并且新的长度是之前的长度 +1 ,这样才能存放当前新的值,将新值填充后,再替换掉旧的 array 数组后,释放当前锁。
  3. 当使用 get 获取数据时,无需上锁,直接读取当前 array 数组的指定位置。
  4. 当使用 remove 时,同样先进行上锁,然后再获取当前的 array 数组,如果传入的 index 正好是最后一个,则使用 copyOf ,长度进行 -1 ,否则的话先声明一个新的 array 数组,现将0index 的数据 arraycopy 至新的 array 数组,然后再将 index + 1 后的再 arraycopy 至新的 array 数组,最后将新的 array 数组替换旧的,然后释放锁。

读下来之后可以感觉出来 CopyOnWriteArrayList 的源码非常容易理解和阅读,同时我们也可以看出一些问题,CopyOnWriteArrayList 实现了写写隔离,但读读是可以共享的,这就有可能出现当某个数据再修改时,读进行了操作,导致读取到的还是旧的数据。还有就是每次写操作都对数组进行 Copy ,假如数据量非常大的情况下,进行 Copy 消耗的资源则会进行 x 2 ,因此使用 CopyOnWriteArrayList 时,需要考虑下自己的数据量以及读写的频次。

http://www.mmbaike.com/news/111879.html

相关文章:

  • 网站建设经理网站的seo方案
  • 做一静态网站 多少钱买外链
  • 大型服装网站建设培训行业seo整站优化
  • 安徽做网站公司深圳网站设计
  • 网站官网建设百度推广一年大概需要多少钱
  • 有哪些做特卖的网站农产品网络营销方案
  • 网站上传wordpress免费发布友链
  • 网站文字格式商品标题关键词优化
  • 国内哪些公司做商城型网站靠谱如何拥有自己的网站
  • 自己做网站图片存在哪里培训网站
  • 学做网站论坛怎么样友情链接怎么添加
  • 做旅游宣传不错的网站北京seo执行
  • 佛山网站建设网站制作公司哪家好品牌网络营销策划书
  • 网站商城建设合同范本网络服务器
  • 做网站需要学jsp百度指数查询手机版
  • 茶网站设计素材下载营销模式和营销策略
  • 今天广西新闻回放seo优化人员
  • 客流分析系统 白皮书外贸网站建设优化推广
  • 聚名网合法吗网站优化的关键词
  • wordpress url斜杠首页优化排名
  • 做网站投诉要钱吗爱站网seo综合查询工具
  • 企业网站结构图营销方式
  • 网站排名应该怎么做东莞网站推广营销网站设计
  • 专业做俄语网站建设司seo推广方式是什么呢
  • 学习网站建设多少钱世界最新新闻
  • 泰安58路正规网站优化公司
  • 泉州百度网站快速优化免费推广软件平台
  • 专业做网站排名的人凡客建站
  • 如何自建网站做外贸推广赚钱app哪个靠谱
  • wordpress技术类博客百度seo关键词排名价格