回调中的Threadlocal用法

时间:2012-11-28 06:52:31

标签: java multithreading thread-local

当我多次看到Joshua Bloch的以下声明时,我正在阅读ThreadLocal课程。

通过您无法控制的回调“降低”值:有时您必须调用一个回调到您的包中的库方法。此时,由于库中的缺陷,您需要一些您无法传递给自己的上下文。在这种罕见的情况下,线程本地人可以成为救星。

很难理解这一个......如果有人可以详细说明那么,我们将不胜感激

Thanks..Heena

2 个答案:

答案 0 :(得分:3)

我的应用程序调用一个搜索存储数据的库。

该库还有一个可以实现的接口,告诉它如何将搜索的原始结果转换为您想要的数据格式。

我如何将搜索结果转换为我想要的对象的实现涉及了解特定的时区。

所以过程是,(A)我调用库搜索方法,(B)搜索方法然后调用我的另一段代码将原始结果转换为我的格式,(C)我的转换需要知道时区。面临的挑战是如何制作我在A点知道的时区信息,可以在C点找到?

显然,库提供的方法不包括传递时区,所以我将它粘贴在ThreadLocal中!

答案 1 :(得分:1)

假设您调用了第三方函数,稍后会回调您的代码。在你的回调中你需要一些上下文,即能够访问你的一些变量。但是,第三方函数的不足之处在于它无法通过代码将对象引用传递给回调函数。

你要做什么?

不幸的是,除了将上下文存储在实际上是一个全局变量之外,你真的没有多少选择(哦,恐怖!)。 ThreadLocal是对全局变量的略微改进,因为使用此hack的多个线程不会相互踩到脚趾。

当然,如果回调发生在与调用第三方函数的线程不同的线程上,则该技术会中断。

此外,该技术无法扩展。如果同时注册两个回调,则需要两个不同的回调函数和两个不同的全局上下文。