您的位置:首页 > 编程语言 > Java开发

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中(前提是这些变量的语义允许这样做,比如要统计总请求次数这样的变量就不合适了),这样可以确保线程安全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息