什么时候以及如何使用ThreadLocal变量? 推荐| Java Debug 笔记

469 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

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

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

如何使用?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

一种可能的(并且是常见的)用法是,当您有一些不是线程安全的对象,但又希望避免同步对该对象的访问时(例如,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);
    }
}

文件资料。

高分回答:

许多框架使用ThreadLocals来维护一些与当前线程相关的上下文。

例如,当当前事务存储在ThreadLocal中时,您不需要通过每个方法调用将它作为参数传递,以防堆栈中有人需要访问它。

Web应用程序可以在ThreadLocal中存储有关当前请求和会话的信息,以便该应用程序可以轻松访问它们。

使用Guice,您可以在为注入的对象实现自定义范围时使用ThreadLocals (Guice的默认servlet范围很可能也使用它们)。

ThreadLocals是一种全局变量(尽管邪恶程度稍低,因为它们仅限于一个线程),因此在使用它们时应小心避免不必要的副作用和内存泄漏。设计您的API,以便在不再需要ThreadLocal值时将始终自动清除它们,并且不会错误使用API​​(例如,如下所示)。ThreadLocals可以用来使代码更清洁,在某些罕见的情况下,他们是做什么工作的唯一方法(我当前的项目有两个这样的情况下,它们都记录在这里下的“静态字段和全局变量”)。

文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/8…

作者建议: 我会使用ThreadLocal来限制SimpleDateFormat只能在线程内共享

关于日期转换的文章参考:Java字符串到日期的转换? 推荐

比如说,一个操作日志的功能,我们就需要使用到ThreadLocal来记录当前线程的请求的操作人信息。

因此可以推论出我们的日志跟踪系统, 也会使用到ThreadLocal

当然很多地方都有使用到ThreadLocal ,我打开一个spring的项目使用CTRL + SHIFT +F 来查找关于ThreadLocal

图片.png

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️