来自 Java Concurrency in practice第 3.3.3 章。 线程本地
Thread-local variables are often used to prevent sharing in designs based on mutable Singletons or global variables.
如果我们将可变的 Singleton 人包装在 ThreadLocal 中,每个线程都会有自己的 Singleton 副本?那么它将如何保持单例?这是作者的意思还是我在这里遗漏了一些非常明显的东西?
最佳答案
If we wrap the mutable Singleton guy in a ThreadLocal
据我所知,您没有使用 ThreadLocal 包装单例类,但是单例中包含的对象是可变 或非线程安全的。正如示例正确讨论的那样,JDBC 连接 不是线程安全的,需要额外的保护,这反过来会增加争用。
因此,在单例仅用于共享目的的情况下,将这些东西替换为 ThreadLocal 是一个好主意,因为所有线程都有自己的连接,不需要额外的保护。
ThreadLocal 的另一个用例是Random generation,如果只有一个Random
对象,那么线程内部就会争用“seed” ,所以如果每个线程都有自己的 Random 对象,那么就不再存在争用,这是有道理的。
关于java - 关于使用 ThreadLocals 包装可变单例对象的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14786723/