什么时候应该更喜欢ThreadLocal
超过同步,除了性能提升?请用现实生活中的例子来解释。
ThreadLocal
不是synchronized
的替代品。 ThreadLocal
解决的主要问题是如何在应用程序中管理每线程static
数据。
static
是你应该尽可能避免的东西:它是一个不可测试的脆弱代码的配方。
使用线程的唯一原因是出于性能原因(或者您可能喜欢混淆;)。
AFAICS如果您对性能进行折扣,则没有理由使用Threads,ThreadLocal或同步。
ThreadLocal在Thread中提供全局变量访问。当您希望跨方法共享变量并仍保留Thread范围时,这将有所帮助。
J2EE应用程序服务器使用ThreadLocal来跟踪事务,安全上下文而不传递
当你使用ThreadLocal变量时,线程只能使用它来查看和操作它们,没有其他线程可以看到它们。线程局部变量在线程执行时也会死亡。在使用线程池时,应该小心使用ThreadLocal变量。
ThreadLocal变量放在一个名为Thread private stack的特殊内存空间中。
共享变量放在堆内存空间中,它们在所有线程之间共享,它们是同步还是不同步。
所以更多的是关于用例而不是性能。
可以使用ThreadLocal变量来保持与某些DB的连接,其中连接仅与当前线程相关联,并且不需要其他线程来查看它并且需要同步它。例如,缓存 - 例如内存映射或列表中的共享在服务器应用程序中的所有线程之间共享,并且必须同步。