java并发编程实战笔记---(第三章)对象的共享
3.1 可见性
synchronized 不仅实现了原子性操作或者确定了临界区,而且确保内存可见性。
*****必须在同步中才能保证:当一个线程修改了对象状态之后,另一个线程可以看到发生的状态变化。
1.失效值问题

以上类非线程安全,get和set在非同步情况下获取value值。
当一个线程修改value,另一个线程可能得到更新后的值,也可能得不到。

对get和set进行同步,可以是成为线程安全类。
2. long或者double 需要用volatile修饰或者用锁保护。 因为64位值可能被拆为2个32位操作。
3.volatile 修饰变量,确保获取最新值。
加锁可以确保可见性和原子性,而volatile只能确保可见性。

可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态:
- 对变量的写操作不依赖于当前值。
- 该变量没有包含在具有其他变量的不变式中。

lower upper非独立于其他状态
3.2发布与逸出
发布:对象能够在当前作用域之外的代码中使用。

逸出: 某个不应该被发布的对象被发布。












3.3线程封闭

将某个对象封闭在某个线程中。举例:connection从线程池拿出给某个线程使用,且不会在分给其他线程。
java及核心库提供支持:例如 局部变量和ThreadLocal
但是程序员仍要确保封闭在线程中的对象不会从线程中逸出。
2栈封闭
局部变量的固有属性,就是封闭在执行的栈中。其他线程无法访问这个栈。但是编程要确保不逸出。

开发人员要给出注释那些对象需要封闭到执行线程中,便于以后维护时不会造成逸出。
3.threadlocal
3.4不变性
不可变对象一定是线程安全的。
满足以下条件时,对象才不可变:
1.对象创建以后其状态就不能修改。
2.对象的所有域都是final类型。
3.对象是正确创建的(对象的创建期间,this引用没有逸出)。
1.Final域

2.volatile类型来发布不可变对象(volatile+不可变对象)

当需要对一组数据以原子方式执行某些操作时,可以考虑创建一个不可变类来封装这些数据。如上例。
对于在访问和更新多个相关变量时出现的竞争性条件,通过将这些变量保存在一个不可变类中来消除。不可变对象,当线程获得该变量引用后,不必担心其他线程会修改该对象的状态。如果要更新该对象,可以创建 一个新的容器对象 。其他线程没有影响。
总结:将变化的封装在一个不变的容器类中,讲内容的变化改为创建一个新的容器。


3.5安全发布
上面讨论的是如何让对象不被发布,讲对象封闭在线程或者另一个对象中。但是有时需要在线程中共享对象,所以需要安全发布对象。
//在没有足够同步的情况下发布对象,不要这么做
public Holder holder;
public void intialize() {
holder = new Holder(42);
}
存在可见性问题,其他线程看到未被完全创建的对象。
1.不正确的发布:正确的对象被破坏
class Holder{
private int n;
public Holder(int n) { this.n = n; }
public void assertSanity() {
if( n != n) {
throw new AssertionError("this statement is error");
}
}
}
2.安全发布的常用模式:



3.事实不可变对象:
如果对象的状态在发布后不会在改变,称为事实不可变状态。


*********

线程安全共享:此类内部实现同步。
保护对象:使用时加锁。
java并发编程实战笔记---(第三章)对象的共享的更多相关文章
- 《Java并发编程实战》第三章 对象的共享 读书笔记
一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...
- java并发编程实战:第三章----对象的共享
我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它:我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化. 一.可见性 重排序:在没有同步的情况下,编译器.处理器可能对代码的执行顺 ...
- 《Java并发编程实战》第四章 对象的组合 读书笔记
一.设计线程安全的类 在设计线程安全类的过程中,须要包括下面三个基本要素: . 找出构成对象状态的全部变量. . 找出约束状态变量的不变性条件. . 建立对象状态的并发訪问管理策略. 分析对象的 ...
- java并发编程读书笔记(1)-- 对象的共享
1. 一些原则 RIM(Remote Method Invocation):远程方法调用 Race Condition:竞态条件 Servlet要满足多个线程的调用,必须是线程安全的 远程对象,即通过 ...
- java并发编程实战笔记---(第二章)线程安全:正确性
ThreadA__________ 同步 ______________ 异步 ___________ 异步 ThreadB__________ ____________ ...
- java并发编程实战:第四章----对象的组合
一.设计线程安全的类 找出构造对象状态的所有变量(若变量为引用类型,还包括引用对象中的域) 约束状态变量的不变性条件 建立对象状态的并发访问管理策略(规定了如何维护线程安全性) 1.收集同步需求(找出 ...
- Java并发编程学习笔记(三)——对象的组合
重要概念: 1.在设计线程安全类的过程中,需要包含以下三个基本要素: (1)找出构成对象状态的所有变量. (2)找出约束状态变量的不变性条件. (3)建立对象状态的并发访问管理策略. 2.
- Java并发编程学习笔记(二)——对象的共享
主要概念:可见性.重排序.失效数据.最低安全性.发布.逸出.线程封闭(Ad-hoc.栈封闭.ThreadLocal类).不变性.Final域.事实不可变对象. 1.在没有同步的情况下,编译器.处理器以 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- Java并发编程实战.笔记十一(非阻塞同步机制)
关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...
随机推荐
- 【BZOJ4767】两双手(动态规划,容斥)
[BZOJ4767]两双手(动态规划,容斥) 题面 BZOJ 题解 发现走法只有两种,并且两维坐标都要走到对应的位置去. 显然对于每个确定的点,最多只有一种固定的跳跃次数能够到达这个点. 首先对于每个 ...
- 【POJ1741】Tree(点分治)
[POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...
- Linux内核分析第四周学习总结——系统调用的工作机制
Linux内核分析第四周学习总结--系统调用的工作机制 内核态 执行级别高,可以执行特权指令,访问任意物理地址,在intel X86 CPU的权限分级为0级. 用户态 执行级别低,只能访问0x0000 ...
- NOIP2017 Day2 T3 列队(treap)
可以直接用treap上大模拟...n+1个treap维护n行的前m-1个点和最后一列. 需要支持删除一个点或者一段区间,而空间并不支持存下所有的点的时候,可以用一个点代替一个区间,记录区间首项的值和区 ...
- Libevent学习笔记(五) 根据例子学习bufferevent
libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...
- 第5章-Vue.js交互及生命周期练习
一.学习目标 使用网络请求进行前后端交互 (重点) 理解钩子函数的作用 (难点) 掌握Vue.js过滤器的使用方法 了解Vue.js事件的深入用法 (重点) 二.仿写留言板 2.1.实现" ...
- [DeeplearningAI笔记]序列模型2.3-2.5余弦相似度/嵌入矩阵/学习词嵌入
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.3词嵌入的特性 properties of word embedding Mikolov T, Yih W T, Zwe ...
- Ubuntu 火狐浏览器中,鼠标选择文字被删除的解决办法
copy from :http://blog.csdn.net/shadow066/article/details/50628019 在终端中输入命令:ibus-setup 将 “在应用程序窗口中启用 ...
- Thinkphp关联模型使用
1.需求描述 首页文章列表,需要同时获取文章的点赞和被关注数,同时如果被当前用户点赞或关注了会显示相应小图标进行区别.图示如下: 2.解决方案 数据库设计: 文章对应Article表,其中包括收藏数字 ...
- SpringCloud (一)Eureka注册中心搭建
前提 系统安装jdk1.8及以上,配置好maven的ide(这里用idea进行演示,maven版本3.5,配置阿里云源) 项目搭建 新建一个maven项目,创建最简单的那种就好,项目名这里为Eurek ...