博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
看java并发编程实战 Synchronized 的一点思考
阅读量:5807 次
发布时间:2019-06-18

本文共 1015 字,大约阅读时间需要 3 分钟。

看《java 并发编程实战》 第4章 程序清单4-14附件时

class BadListHelper <E> {

public List
list = Collections.synchronizedList(new ArrayList
());public synchronized boolean putIfAbsent(E x) { boolean absent = !list.contains(x); if (absent) list.add(x); return absent;}

}

@ThreadSafe

class GoodListHelper <E> {

public List
list = Collections.synchronizedList(new ArrayList
());public boolean putIfAbsent(E x) { synchronized (list) { boolean absent = !list.contains(x); if (absent) list.add(x); return absent; }}

}

对于BadListHelper 下面的话如何理解?

clipboard.png

我的理解是:

public synchronized boolean putIfAbsent(E x)方法等同于
public boolean putIfAbsent(E x){
synchronized (this){

....

}

}

他是对BadListHelper 上的锁,也只能保证同一时刻只有一个线程可以访问BadListHelper 同一实例的putIfAbsent方法。但是持有list的引用的其它线程任然可以使用list其它方法修改list(即使该方法对应list来说是线程安全的、原子的); 但是我们的目的是 为了同一时刻只能有一个线程可以修改list。 因此书上说 “问题在于错误的锁上进行了同步” 。

GoodListHelper 的putIfAbsent是对list进行上锁,因此任何访问list的线程安全的方法,同一时刻只能有一个线程进行。

转载地址:http://zeubx.baihongyu.com/

你可能感兴趣的文章
数据结构——串的朴素模式和KMP匹配算法
查看>>
FreeMarker-Built-ins for strings
查看>>
验证DataGridView控件的数据输入
查看>>
POJ1033
查看>>
argparse - 命令行选项与参数解析(转)
查看>>
一维数组
查看>>
Linux学习笔记之三
查看>>
Floyd最短路算法
查看>>
Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为?
查看>>
CentOS 6.6 FTP install
查看>>
C#------判断btye[]是否为空
查看>>
图解Ajax工作原理
查看>>
oracle导入导出小记
查看>>
聊一聊log4j2配置文件log4j2.xml
查看>>
NeHe OpenGL教程 第七课:光照和键盘
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
Php实现版本比较接口
查看>>
删除设备和驱动器中软件图标
查看>>
第四章 TCP粘包/拆包问题的解决之道---4.1---
查看>>
html语言
查看>>