当前位置: 首页 > 面试题库 >

Java 什么时候以及如何使用ThreadLocal变量?

双恩
2023-03-14
问题内容

什么时候应该使用ThreadLocal变量?

如何使用?


问题答案:

一种可能的(并且是常见的)用法是,当你有一些不是线程安全的对象,但又希望避免同步对该对象的访问时(我正在看着你,SimpleDateFormat)。而是给每个线程自己的对象实例。

例如:

public class Foo
{
    // SimpleDateFormat is not thread-safe, so give one to each thread
    private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
        @Override
        protected SimpleDateFormat initialValue()
        {
            return new SimpleDateFormat("yyyyMMdd HHmm");
        }
    };

    public String formatIt(Date date)
    {
        return formatter.get().format(date);
    }
}


 类似资料:
  • 问题内容: 给定以下程序: 您是否希望在run方法中的while循环仍在执行且局部变量test仍在范围内时调用finalize? 更重要的是,此行为在任何地方都有定义吗?Sun有什么声明它是实现定义的吗? 这与以前人们在主要关注内存泄漏的SO上提出此问题的方式相反。在这里,我们让GC积极地对变量感兴趣的变量进行GC处理。您可能会因为测试仍在“范围内”而不会被GC,所以您可能会期望这样做。 作为记录

  • 问题内容: 我读包含在大括号关键字后的代码块中一个的上下文中流动,必须调用标有一个函数使用属性或传输控制,,或。 最后一部分很清楚,而第一部分我不太清楚。 首先,即使您未声明任何返回类型,任何函数都将返回某些内容(至少一个空元组)。其次,什么时候可以使用函数?文档是否建议一些标记为的内置内置方法? Guard语句的else子句是必需的,并且必须调用带有noreturn属性标记的函数,或者使用以下语

  • 问题内容: 我无法理解hibernate何时进入二级缓存以及何时使缓存失效。 这是我目前所了解的: 第二级缓存在会话之间存储实体,作用域为SessionFactory 您必须告诉要缓存的实体,默认情况下不会缓存任何实体 查询缓存将查询结果存储在缓存中。 我不明白的是 hibernate何时会命中此缓存? 假设我已经设置了二级缓存,但没有设置查询缓存。我想缓存我的客户,其中有50000。我可以通过哪

  • 问题内容: 创建ajax请求时,GET over POST有什么优势,反之亦然?我如何知道在任何给定时间应该使用哪个?这是安全意识的决定吗? 此外,实际发送方式有何不同? 问题答案: POST请求是您不想意外发生的请求。GET请求是您可以通过用户通过URL指向浏览器来进行的请求。 GET请求可以非常简单地重复,因为它们的数据基于URL本身。 您应该像考虑常规表单请求(及其GET和POST)一样考虑

  • 问题内容: 这是成功的send()是“原子的”吗?,因为我认为它实际上实际上涉及系统调用,而不仅仅是在套接字上发送。 哪些系统调用可以被中断,何时中断,中断在哪里处理?我已经了解了SA_RESTART,但并不完全了解发生了什么。 如果我在没有SA_RESTART的情况下进行系统调用,该调用是否可以被与我的应用程序无关但需要操作系统中止我的调用并执行其他操作的任何类型的中断(例如,用户输入)中断?还

  • 问题内容: 为什么以及何时应该在php中使用该函数?使用后是否应该始终使用它?我读到我必须使用它来防止会话固定,这是唯一原因吗? 问题答案: 什么啊 就像函数名称所说的那样,它是一个函数,它将用新的ID替换当前的会话ID,并保留当前的会话信息。 它有什么作用? 它主要有助于防止会话固定攻击。会话固定攻击是恶意用户试图利用系统中的漏洞固定(设置)另一个用户的会话ID(SID)的地方。这样,他们将拥有