Java并发编程实践笔记(五)——chapter3(发布溢出,线程封闭)
来源:互联网 发布:java时间比较大小 编辑:程序博客网 时间:2024/05/16 16:03
1.发布与溢出
1.发布
将对象的引用存储到公共静态域。
在非私有方法中返回引用。
2.溢出
一个对象在尚未准备好就将它发布出去——溢出。
“内部类发布也会引发溢出”,因为只有当对象通过构造函数返回之后,才处于稳定状态。这种发布会导致this溢出。
“即使在构造函数的最后一行发布也会有该问题”,指令重排序可能会引发一些奇怪的问题。而且该引用已经不是null了,但是内容还没有初始化完毕也有可能。
“不要让this在构造期溢出!”
3.常见错误
1.在构造函数中创建并启动线程
这个时候线程已经获得了this的引用(即使是隐式的,因为该Runnable或者Thread是所属对象的内部类),this引用几乎总是被新线程所共享。
所以在构造函数中创建线程没有错误,但是不要在构造函数中启动它。
2.注册一个内部类
这种做法是不安全的。
可以使用静态工厂和私有构造函数来解决这个问题。
2.线程封闭
数据仅在单线程中被访问,即数据不共享。
几种方式:
1.池化思想
数据库连接池的每一个连接都不要求是线程安全的,但是它在从池中被拿出来使用的时候只会分配给一个线程。
2.java的ThreadLocal和一些本地变量
使用ThreadLocal可以做到线程隔离,每个线程都有自己单独的一个区域保存变量。
或者使用本地变量,局部变量。
注意不要让当前线程中的对象从所在线程溢出!
3.ThreadLocal
如果要将一个单线程程序迁移到多线程中,可以把共享的全局变量都存到ThreadLocal中(前提是这些变量的语义允许这样做,比如要统计总请求次数这样的变量就不合适了),这样可以确保线程安全。
0 0
- Java并发编程实践笔记(五)——chapter3(发布溢出,线程封闭)
- Java并发编程实践笔记(四)——chapter3(重排序优化,可见性)
- Java并发编程实践笔记之—线程封闭(Thread Confinement)
- Java并发编程实战学习笔记(三)-线程封闭
- Java并发编程实践3.3-线程封闭
- <Java 并发编程实践>读书笔记 --- 线程封闭
- Java 并发编程(二)对象的发布逸出和线程封闭
- Java并发编程--线程封闭(Ad-hoc、栈、ThreadLocal)
- 【java】【并发编程】线程封闭
- Java并发编程实践笔记(一)——chapter1(IO,连接,线程)
- Java并发编程实践笔记(二)——chapter1(线程安全)
- java线程学习(二)—并发编程实践学习笔记
- Java并发编程实践笔记之—线程
- 《JAVA并发编程实践》读书笔记(五)
- 《JAVA并发编程实践》读书笔记(五)
- 【Java并发编程实践】— 线程安全
- Java并发编程读书笔记(三)之发布与溢出
- Java 并发编程(三)设计线程安全的类-实例封闭
- 界面 滚动条设置
- Linux命令
- HDU 2034 人见人爱A-B(集合的差值)
- 弹出系统dialog或者在service里面显示dialog
- 第9周项目三--稀疏矩阵的三元组表示的实现及应用(1)
- Java并发编程实践笔记(五)——chapter3(发布溢出,线程封闭)
- git 连接 github
- 更改django admin登录界面显示的"Django 管理"
- 集成ReactNative过程中的那些坑
- 第10节--python数据结构--dictionary
- 设置TextView文本超出显示省略号
- mysql函数
- Android使用fitsSystemWindows属性实现状态栏【status_bar】的适配方案
- OKHTTP之缓存配置详解