Java并发编程实践笔记(五)——chapter3(发布溢出,线程封闭)
2016-10-25 11:52
916 查看
1.发布与溢出
1.发布
将对象的引用存储到公共静态域。在非私有方法中返回引用。
2.溢出
一个对象在尚未准备好就将它发布出去——溢出。“内部类发布也会引发溢出”,因为只有当对象通过构造函数返回之后,才处于稳定状态。这种发布会导致this溢出。
“即使在构造函数的最后一行发布也会有该问题”,指令重排序可能会引发一些奇怪的问题。而且该引用已经不是null了,但是内容还没有初始化完毕也有可能。
“不要让this在构造期溢出!”
3.常见错误
1.在构造函数中创建并启动线程
这个时候线程已经获得了this的引用(即使是隐式的,因为该Runnable或者Thread是所属对象的内部类),this引用几乎总是被新线程所共享。所以在构造函数中创建线程没有错误,但是不要在构造函数中启动它。
2.注册一个内部类
这种做法是不安全的。
可以使用静态工厂和私有构造函数来解决这个问题。
2.线程封闭
数据仅在单线程中被访问,即数据不共享。几种方式:
1.池化思想
数据库连接池的每一个连接都不要求是线程安全的,但是它在从池中被拿出来使用的时候只会分配给一个线程。2.java的ThreadLocal和一些本地变量
使用ThreadLocal可以做到线程隔离,每个线程都有自己单独的一个区域保存变量。或者使用本地变量,局部变量。
注意不要让当前线程中的对象从所在线程溢出!
3.ThreadLocal
如果要将一个单线程程序迁移到多线程中,可以把共享的全局变量都存到ThreadLocal中(前提是这些变量的语义允许这样做,比如要统计总请求次数这样的变量就不合适了),这样可以确保线程安全。相关文章推荐
- Java并发编程实践笔记之—线程封闭(Thread Confinement)
- 编程实践笔记{Java 线程 并发处理 Webservice}
- Java并发编程实践3.3-线程封闭
- java线程学习(二)—并发编程实践学习笔记
- 编程实践笔记{Java 线程 并发处理 Webservice}
- Java并发编程实践笔记(一)——chapter1(IO,连接,线程)
- Java并发编程实践笔记之—发布和逸出(Publication and Escape)
- Java并发编程实践笔记之—线程
- 编程实践笔记{Java 线程 并发处理 Webservice}(转)
- <Java 并发编程实践>读书笔记 --- 线程封闭
- Java并发编程实践笔记之——用锁来保护状态(Guarding State with Locks)
- JAVA并发编程实践- 线程的优点
- Java并发编程实践笔记之-什么是线程安全
- (38)21.3.8 线程本地存储---Java编程思想之并发笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- Java并发编程实践3.5-安全发布
- Java并发编程实践笔记之—并发容器(Concurrent Collections)