发布一个对象是指:使对象能够在当前作用域之外的代码使用。
线程的安全性和内部状态息息相关,而内部状态的发布会破坏封装性,将会导致安全性更难保障。
逸出:不应该被发布的对象被发布。
注:发布一个对象,同样发布了该对象所有非私有域所引用的对象。
发布的方式,比如:
1 将对象引用存储到公共静态域。
2 从公共方法中返回对象引用。
3 将对象传递给外部方法。
(上述三者很好理解)
4 发布一个内部的类实例。
(this 引用在构造过程中逸出,这样对象并没有正确的构建。)
this引用在构造过程中逸出的解决办法:私有构造函数+工厂方法 => getInstance(){ 创建并返回实例 }
—————————————————————————————————————————————————————————————————————————————
线程封闭:
除了同步以外,如果将某个对象封闭在一个线程中,那么也可以保证线程安全。(即是被封闭的对象那个本身不是线程安全的)。
实现方式之栈封闭:理解为使用局部变量(只有通过局部变量才能访问对象)。因为!局部变量的引用是保持在线程栈中的,只对当前线程可见,其他线程不可见。所以局部变量是线程安全的。
实现方式之ThreadLocal:
ThreadLocal提供了get和set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,而且get总是返回由当前线程在调用set时设置的最新值。
其实就是将读写方法包装起来,这个包装是和线程相关联的,
对于ThreadLocal<T> 可以理解为一个映射 Map<Thread, T> 即存储的对象(变量)和线程相关联。保存副本,并可以通过线程查找到该线程对应的变量的副本。
所以 变量 就被封锁到了对应线程之内了!