Collections.synchronizedList使用方法陷阱(1)
无意发现了这个例子,拿来记住
@NotThreadSafe
class BadListHelper <E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if (absent)
list.add(x);
return absent;
}
}
虽然说putIfAbsent方法加了synchronized的锁关键字,但是这个putIfAbsent方法获得锁和list对象的获得锁不是同一个锁;
putIfAbsent获得锁是BadListHelper这个类的锁对象,
list获得锁对象是list;
如果这么写,那list依旧能够被其他线程获取锁对象来改变list对象的值,就会导致数据出错,或者两两线程在访问这个方法的时候拿到的list数据可能会有错误;所以这么写是不对的;
要想保证list数据不出错,就要给他自己上锁,其他线程将不能获得list锁来来改变list对象。
@ThreadSafe
class GoodListHelper <E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public boolean putIfAbsent(E x) {
synchronized (list) { //获得list锁对象,其他线程将不能获得list锁来来改变list对象。
boolean absent = !list.contains(x);
if (absent)
list.add(x);
return absent;
}
}
}
Collections.synchronizedList使用方法陷阱(1)的更多相关文章
- Collections.synchronizedList线程安全性陷阱
摘要: 详细的解析:Collections.synchronizedList 1 :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedLi ...
- 【集合类型的并发】Collections.synchronizedList
摘要: 详细的解析:Collections.synchronizedList :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedList ...
- Collections.synchronizedList使用
1.SynchronizedList类具体代码: static class SynchronizedList<E> extends SynchronizedCollection<E& ...
- CopyOnWriteArrayList与Collections.synchronizedList的性能对比
列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ...
- CopyOnWriteArrayList与Collections.synchronizedList的性能对比(转)
列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ...
- CopyOnWriteArrayList&Collections.synchronizedList()
1.ArrayList ArrayList是非线性安全,此类的 iterator() 和 listIterator() 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remov ...
- Collections.synchronizedList 、CopyOnWriteArrayList、Vector介绍、源码浅析与性能对比
## ArrayList线程安全问题 众所周知,`ArrayList`不是线程安全的,在并发场景使用`ArrayList`可能会导致add内容为null,迭代时并发修改list内容抛`Concurre ...
- 线程安全Collections.synchronizedList
ollections.synchronizedList引发的线程安全问题 有些容器是线程安全的(Vector,ConcurrentLinkedQueue等),有些则不是(list等),利用类 似 pr ...
- ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点
ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...
- 关于Collections.sort()排序方法的源码探索
/**下面在自己代码中使用Collections.sort()方法去比较Student对象,通过在自己写的类里面通过匿名内部类实现Comparator接口,这个接口是让你自己实现比较器的规则*/ // ...
随机推荐
- 代码随想录 day0 博客怎么写
前言 2.25日开始记录自己的博客生涯以及代码随想录训练营的每日内容 一.题目链接怎么找?怎么设置连接? 力扣题目链接1:力扣 二.正文怎么写? 二分查找 算法思路: 二分查找需要保证数组为有序数组同 ...
- 【SQL Server】中的日期函数和日期数据类型
SQL Server Date 函数 SQL Server的重要日期函数包括: 函数 描述 参数含义 GETDATE() 返回当前的日期和时间 DATEPART(datepart,date) 返 ...
- html原声启动本地服务器,用http-server启动本地服务器
第一: 准备node.js环境: 打开cmd,输入:npm install http-server -g 第二: 安装 http-server npm install http-server -g 安 ...
- linux run/media/wang/centos_磁盘爆满
在使用iso安装了linux系统后,会有个 /run/media/wang/CentOS 7 x86_64 无法删除,这个是我们安装程序时的安装驱动, 登陆用户后将他卸载就可
- 修改python下载镜像源
找到pip.ini(可能在"C:\Users\Administrator\AppData\Roaming\pip\pip.ini")→记事本打开→添加相应源 如果没有找到,在C:\ ...
- cgroup与docker
1.使用 cgroup namespace 需要内核开启 CONFIG_CGROUPS 选项.可通过以下方式验证: 1 root@container:~/namespace_test# grep CO ...
- Visusl Studio使用技巧
一.快捷键的使用 1.使用Ctrl+K,Ctrl+E,可以清理代码,包括清理无用的using和对齐代码: 也可以使用快捷按钮实现该功能,如下图: 2.使用Ctrl+K,Ctrl+D,可以对齐代码 建议 ...
- [转载] Image Types
转载自https://www.mathworks.com/help/matlab/creating_plots/image-types.html Image Types Indexed Images ...
- 13-之容器资源需求、资源限制及Metric-server(Heapster)
目录 容器资源需求.资源限制及Heapster Heapster 资源指标API及自定义指标API k8s-promtheus监控部署 node-exporter prometheus kube-st ...
- 关于服务器选择的chatgpt 的回答
I want to deploy linux as a server with low latency transactions. Which version of the operating sys ...