关于使用ThreadLocals包装可变单例对象的建议

Gee*_*eek 7 java multithreading thread-local

来自Java Concurrency in practice Chapter 3.3.3.ThreadLocal的

线程局部变量通常用于防止基于可变单元或全局变量的设计中的共享.

如果我们在ThreadLocal中包装可变的Singleton人,每个线程都有自己的Singleton副本?那么它将如何保持单身?这是作者的意思还是我错过了一些非常明显的东西?

Nar*_*hai 2

如果我们将可变的 Singleton 包装在 ThreadLocal 中

AFAIK,您不会使用 ThreadLocal 包装单例类,而是使用单例中包含的对象,该对象是可变的或非线程安全的。正如该示例正确讨论的那样,JDBC 连接不是线程安全的,需要额外的保护,这反过来又增加了争用。

因此,在单例仅用于共享的情况下,用 ThreadLocal 替换这些东西是一个好主意,因为所有线程都有自己的 Connection,并且不需要更多额外的保护。

ThreadLocal 用例的另一个很好的例子是随机生成,如果有一个Random对象,那么线程内就会存在对“种子”的争用,因此,如果每个线程都有自己的 Random 对象,那么就不再存在争用,这是有道理的。