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

建网站当老板青龙桥网站建设

建网站当老板,青龙桥网站建设,晋中网站设计,慧聪网seo页面优化目录 一. 多线程下使用ArrayList 1.1. 自行判断加锁 1.2 使用Collections.synchronizedList()套壳加锁 1.3 CopyOnWriteArrayList类 二. 总结 一. 多线程下使用ArrayList 多线程下使用ArrayList会涉及到线程安全问题, 例如: public static void main(String[] args) thro…

目录

一. 多线程下使用ArrayList

1.1. 自行判断加锁

1.2 使用Collections.synchronizedList()套壳加锁

1.3 CopyOnWriteArrayList类

二. 总结


一. 多线程下使用ArrayList

多线程下使用ArrayList会涉及到线程安全问题, 例如:

    public static void main(String[] args) throws InterruptedException{List<Integer> list = new ArrayList<>();Runnable runnable = () -> {for (int i = 0; i < 50000; i++) {list.add(i);}};// 创建两个线程for (int i = 0; i < 2; i++) {new Thread(runnable).start();}Thread.sleep(5000);System.out.println(list.size());}

可以发现, 最后的结果并不是期待的100000, 这是因为ArrayList中的add方法并没有处理线程安全问题.

那么, 如何解决在多线程场景下使用ArrayList产生的线程安全问题呢? 如下, 有三种解决方案.

1.1. 自行判断加锁

就是根据需要来进行加锁, 将一些可能会产生线程安全问题的操作通过加锁打包成为原子操作.

        Runnable runnable = () -> {for (int i = 0; i < 50000; i++) {synchronized (locker) {list.add(i);}}};

结果正如我们所期待的那样.

1.2 使用Collections.synchronizedList()套壳加锁

对读操作和写操作全部都加锁, 保证线程安全. (此时返回的List对象中的重要操作都加锁了)

但是会降低程序运行效率, 因为读操作本身不会产生线程安全问题, 又加锁就是多此一举了!!!

我们来看看synchronizedList类中add方法是怎么实现的, 

        public void add(int index, E element) {synchronized (mutex) {list.add(index, element);}}

此时, 结果也是正确的.

1.3 CopyOnWriteArrayList类

CopyOnWrite 写时拷贝, 实现了读与读不互斥, 读与写不互斥, 写与写互斥. 保证了线程安全.

那么, 是怎么实现读与写不互斥的呢?

在面临写操作的时候, 会依照旧数组复制一个新数组, 修改操作就在新数组上进行, 最后再将旧数组覆盖.如果在写操作的时候发生了线程切换, 并且切换到了读操作, 此时还是会读取旧数组. 保证了线程安全.

 CopyOnWriteArrayList类中add方法的实现:

        /*** Appends the specified element to the end of this list.** @param e element to be appended to this list* @return {@code true} (as specified by {@link Collection#add})*/public boolean add(E e) {synchronized (lock) {Object[] es = getArray();int len = es.length;es = Arrays.copyOf(es, len + 1);es[len] = e;setArray(es);return true;}}

结果也是正确的.


二. 总结

1. 多线程下使用ArrayList类, 涉及到了线程安全问题, 以及解决线程安全问题的方法.

2. 自行判断加锁. 效率高

3. Collections.synchronizedList()套壳封装, 效率低下. 因为对不涉及线程安全问题的操作进行加锁.(即对List接口中的所有方法进行加锁)

4. CopyOnWriteArrayList类, 写时拷贝. 实现了读与读, 读与写操作不互斥, 写与写操作互斥. 保证了线程安全, 并且效率相对高效.

http://www.yayakq.cn/news/131505/

相关文章:

  • 营销网站建设套餐如何制作一个收费的网页
  • php 商务网站开发实战wordpress视频列表
  • 联客易网站建设制作成都网站建设源码世纪
  • 域名网站备案杭州网络公司服务
  • 自我建设外贸网站网站面包屑如何做
  • 张家港网站建设培训山东烟台最新消息今天
  • 微信制作微网站开发稷山做网站
  • 手机投资理财网站建设玉田县建设工程招标网站
  • 江门网站制作流程松江醉白池网站建设
  • 长沙网站推广平台wordpress手机调度插件
  • 京山网站设计公司网站模板内容怎么添加图片不显示
  • 镇江企业网站制作特价网站建设价格低
  • 用 php网站建设打出一首古诗江阴早晨网站建设
  • 做图片网站侵权吗阿里云域名注册官网电话
  • win10虚拟机做网站免费做电子书的网站
  • 快3网站制作 优帮云市场监督管理局投诉电话
  • 谷歌广告推广网站wordpress主题限速
  • 做网站什么服务器好excel中批量做网站的超链接
  • 江阴网络公司做网站茂名公司网站开发公司
  • 天津建设科技杂志的官方网站网站备案需要哪些资料
  • 网站建设上传和下载wordpress修改文章链接插件
  • wordpress修改底部联系QQ优化大师最新版下载
  • 申请个人网站怎么申请丰宁县建设局网站
  • 烟台建设银行网站企业网络信息安全
  • 怎样查网站有没有备案成都网站建设与推广
  • html网站开发工具网站流量通道
  • 昆明网络科技公司有哪些亚马逊seo搜索什么意思
  • 义乌制作网站要多少钱中国物流企业网
  • 网站响应式和非响应式济宁做网站大约多少钱
  • 企业 备案 网站服务内容中职示范校建设专题网站