当我多次遇到 Joshua Bloch 的以下声明时,我正在阅读 ThreadLocal 类。
通过您无法控制的回调“偷窃”值:有时您必须调用一个回调到您的包中的库方法。此时,您需要一些由于库中的缺陷而无法传递给自己的上下文。在这种罕见的情况下,线程本地人可以成为救命稻草。
很难理解这个..如果有人能详细说明和解释,将不胜感激
谢谢..海娜
当我多次遇到 Joshua Bloch 的以下声明时,我正在阅读 ThreadLocal 类。
通过您无法控制的回调“偷窃”值:有时您必须调用一个回调到您的包中的库方法。此时,您需要一些由于库中的缺陷而无法传递给自己的上下文。在这种罕见的情况下,线程本地人可以成为救命稻草。
很难理解这个..如果有人能详细说明和解释,将不胜感激
谢谢..海娜
我的应用程序调用一个搜索存储数据的库。
该库还有一个您可以实现的接口,告诉它如何将搜索的原始结果转换为您想要的数据格式。
我如何将搜索结果转换为我想要的对象的实现涉及了解特定时区。
所以过程是,(A)我调用库搜索方法,(B)搜索方法然后调用我的另一段将原始结果转换为我的格式的代码,(C)我的转换需要知道一个时区。挑战是如何使我在 A 点知道的信息(时区)在 C 点可用?
显然,该库提供的方法不包括传递时区,所以我把它放在 ThreadLocal 中!
假设您调用了第三方函数,该函数稍后会回调您的代码。在您的回调中,您需要一些上下文,即能够访问您的某些变量。但是,第三方函数的不足之处在于它无法通过他们的代码将对象引用传递到您的回调中。
你要做什么?
不幸的是,除了将上下文存储在一个有效的全局变量中(哦,太可怕了!)之外,您并没有太多选择。ThreadLocal
是对全局变量的轻微改进,因为使用此 hack 的多个线程不会互相影响。
当然,如果回调发生在与调用第三方函数的线程不同的线程上,这种技术就会失效。
此外,这种技术无法扩展。如果同时注册两个回调,则需要两个不同的回调函数和两个不同的全局上下文。