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接口,这个接口是让你自己实现比较器的规则*/ // ...
随机推荐
- css实现一个冰墩墩
一墩难求,花了一两个小时自己画了一个,HTML结构很简单,CSS上主要就是将各个位置定位,肚子上的logo就只有发挥啦 以下是HTML代码 <div class="container& ...
- ubuntu下升级gcc11环境
使用ppa源升级 官网地址: https://launchpad.net/ ppa toolchan/test地址: https://launchpad.net/~ubuntu-toolchain-r ...
- Jmeter使用文档(循环怎么用)
Jmeter使用文档(循环怎么用) 基础用法 修改语言 Jmeter之界面语言设置 下面使用简体中文的命名进行说明 打开日志 启动后,右上角有个黄色的感叹号图标,点击即可打开即时日志 如果没有看到重启 ...
- 关于head中代码被挤到body中的问题
可能是使用php引用文件时出现了问题,文件格式不是utf-8,将其放在head后面就好
- DP4056软硬兼容TP4056,低成本
概述 DP4056是一款单节锂离子电池恒流/恒压线性充电器,采用底 部带散热片的SOP8封装以及简单的外部应用电路,常适 合便携式设备应用,适合USB电源和适配器电源工作,内部采用防倒充电路,不需要外 ...
- 数据库链接失败错误ERROR com.alibaba.druid.pool.DruidDataSource - {dataSource-1} init error解决
用java -jar启动之后,只要一访问数据库就报错,错误信息如下: 文字如下: 2019-07-02 10:25:12.220 ---> [http-nio-8080-exec-1] ---& ...
- node 内存全局配置(--max-old-space-size)
安装完了node和angular之后,使用powershell 窗口进行 ng build --prod打包,会提示内存溢出:JavaScript heap out of memory. 项目内打包解 ...
- Centos 7 环境 安装todesk异常
按照todesk官网安装步骤安装. 其实就两步就完成了,在自己虚拟机centos7环境下测试一切正常,但正式环境centos7.9环境下能安装,但安装完打不开,感觉是内核版本的问题. Todesk-- ...
- Java-如何打包下载成.zip文件
打包下载成.zip文件 项目背景 公司使用vue + SpringBoot实现批量下载功能 今天在调试批量下载这个功能.打包成.zip文件时,在返回给前端浏览器出现报错信息: 后端报错: ERROR ...
- 解决手机点击包含a、button标签时出现背景色问题
a,button { display: inline-block; width: 100%; -webkit-tap-highlight-color:rgba(0,0,0,0);/*添加此样式即可去除 ...