Thread Specific Storage模式:不共享变量,不使用锁。
不同线程使用统一的访问接入点可以获取线程特有的实例。
弊端:
- 隐藏了系统结构,隐藏了应用中各个对象之间的关系,从而使应用更加难于理解。
- 鼓励使用全局对象。
常见使用场景
- 需要使用非线程安全对象,但不希望引入锁
- 使用线程安全对象,但希望避免其使用锁的开销和相关问题
- 隐式参数传递(但会使系统难于理解)
- 特定于线程的单例模式:对于某个类,希望每个线程有且仅有该类的一个实例
线程池环境下使用该模式可能导致数据错乱。需要在适当的时间和地方清理线程特有对象。——任务特有对象
内存泄露:对象永远无法被垃圾回收导致占用的JVM内存无法被释放。
伪内存泄露:可能会被回收,也可能永远无法被回收。
在服务器环境下使用线程特有对象模式需要注意内存泄露和伪内存泄露。(P140有更详细的论述)服务器内部维护一个线程池处理各个Web应用的请求,Web应用停止后,线程池中的各个工作者线程仍然存在。
关键条件是:Web应用程序的类加载器持有对ThreadLocal实例的可达引用。
ThreadLocal通常使用static final修饰。