如何实现 List 集合的线程安全
在实际项目开发中,List 集合较为常用,相比于数组,其提供了更多的方法,便于遍历、搜索、添加与移除。常见的有 ArrayList、Vector等。
关于ArrayList
中所周知,ArrayList不是线程安全的,在多线程开发时,我们不能采取多个线程同时操作 ArrayList,比如我们不能一个线程向 ArrayList中添加元素,一个线程从其中 删除元素,这时会抛ConcurrentModificationException异常。关于这个异常,在上一篇博文中,也有涉及,具体可见:https://www.cnblogs.com/Demrystv/p/11494316.html
关于Vector
Vector是线程安全的,但是其比较笨重,看其源码发现其只是在每个方法上 加上 synchronized 关键字,因此虽然其可以保证线程安全,但是效率低下,在实际开发中不推荐使用。



关于Collections.synchronizedList(List list)
其使用方法如下, List<String> list = Collections.synchronizedList(new ArrayList<>()); 在使用 Collections.synchronizedList(List list) 时,可以像 普通的 ArrayList 那样添加元素,但是在多线程开发中,对其进行遍历,需要添加 synchronized 关键字,这是为什么呢?还是老规矩----看源码!!!

看源码截图中,蓝色框中关于 add、index 等方法中都是带有synchronized 关键字,但是在 iterator 中没有synchronized 关键字,因此上面的疑问迎刃而解!!
如何实现 List 集合的线程安全的更多相关文章
- C# Synchronized 和 SyncRoot 实现线程同步的源码分析及泛型集合的线程安全访问
转载:http://blog.csdn.net/zztfj/article/details/5640889 Synchronized vs SyncRoot 我们知道,在.net的一些集合类型中,譬如 ...
- 通过Collections将集合转换为线程安全类集合
通过Collections将集合转换为线程安全类集合 List集合: List<String> list=new ArrayList<String>();list.add(&q ...
- 编写高质量代码改善C#程序的157个建议——建议22:确保集合的线程安全
建议22:确保集合的线程安全 集合线程安全是指多个线程上添加或删除元素时,线程键必须保持同步. 下面代码模拟了一个线程在迭代过程中,另一个线程对元素进行了删除. class Program { sta ...
- Java中的集合和线程安全
通过Java指南我们知道Java集合框架(Collection Framework)如何为并发服务,我们应该如何在单线程和多线程中使用集合(Collection). 话题有点高端,我们不是很好理解.所 ...
- Java并发编程之set集合的线程安全类你知道吗
Java并发编程之-set集合的线程安全类 Java中set集合怎么保证线程安全,这种方式你知道吗? 在Java中set集合是 本篇是<凯哥(凯哥Java:kagejava)并发编程学习> ...
- Day10_53_Collections.synchronizedList() 将Arraylist集合转换为线程安全的集合
将Arraylist集合转换为线程安全的集合 import java.util.ArrayList; import java.util.Collections; import java.util.Li ...
- Java集合的线程安全用法
线程安全的集合包含2个问题 1.多线程并发修改一 个 集合 怎么办? 2.如果迭代的过程中 集合 被修改了怎么办? a.一个线程在迭代,另一个线程在修改 b.在同一个线程内用同一个迭代器对象进行迭代. ...
- Java中的集合与线程的Demo
一.简单线程同步问题 package com.ietree.multithread.sync; import java.util.Vector; public class Tickets { publ ...
- Java阶段性测试--知识点:数组,面向对象,集合、线程,IO流
#Java基础测试 涉及知识点:数组,面向对象,重载,重写,继承,集合,排序,线程,文件流 一.多项选择题(可能是单选,也可能是多选) 1.下列标识符命名不合法的是( D ). A.$_Name ...
- java各种集合的线程安全
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
随机推荐
- 9.3.2 map端连接-CompositeInputFormat连接类
1.1.1 map端连接-CompositeInputFormat连接类 (1)使用CompositeInputFormat连接类需要满足三个条件: 1)两个数据集都是大的数据集,不能 ...
- 3D点云配准算法简述
蝶恋花·槛菊愁烟兰泣露 槛菊愁烟兰泣露,罗幕轻寒,燕子双飞去. 明月不谙离恨苦,斜光到晓穿朱户. 昨夜西风凋碧树,独上高楼,望尽天涯路. 欲寄彩笺兼尺素.山长水阔知何处? --晏殊 导读: 3D点云 ...
- Linux系统之LVS+Keepalived实现
1.简述lvs四种集群特点及使用场景 LVS集群有4种类型,分别是NAT.DR.TUN.FULLNAT 从工作方式来讲,NAT和FULLNAT都要修改请求报文的目标IP和目标端口(NAT)或源IP目标 ...
- sql 忘记密码 解决方法(window cmd命令解决)
cd wamp\bin\mysql\mysql5.6.17\bin mysqld --skip-grant-tables
- 配置nginx代理服务器访问tomcat服务
nginx原配置文件如下: #user nobody; worker_processes ; #error_log logs/error.log; #error_log logs/error.log ...
- Gong服务实现平滑重启分析
平滑重启是指能让我们的程序在重启的过程不中断服务,新老进程无缝衔接,实现零停机时间(Zero-Downtime)部署: 平滑重启是建立在优雅退出的基础之上的,之前一篇文章介绍了相关实现:Golang中 ...
- 关于软件 TELEGRAM(电报) 的说明
PLUS是TELEGRAM(电报)的三方客户端. 而 电报 是一款即时通讯软件.功能全面,安全性好,但在国内无法直接访问. 相关安全性介绍请看这里:https://www.anquanke.com/p ...
- yamlpy接口测试框架
1.思路: yamlpy即为yaml文件+pytest单元测试框架的缩写, 可以看作是一个脚手架工具, 可以快速生成项目的各个目录与文件, 只需维护一份或者多份yaml文件即可, 不需要大量写代码. ...
- cmake 指定编译特定可执行文件
最近进行编译项目,但是项目中有很多可执行文件:每次编译起来比较费时,下面一组代码可以指定特定的编译目标进行编译,而不用编译所有目标: #!/bin/bash # 通过传递第一个参数,表示要编译的目标: ...
- 一次线上nohup.out日志丢失的问题
今天有小伙伴求助,线上一个应用的nohup.out日志不更新了,但进程还是正常的.此时需要查看这个日志排查一些问题,这可怎么办呢? nohup.out文件的更新时间停留在了昨天9点36,日志也刚好打到 ...