Java使用ThreadLocal

示例

Java并发性中的一个有用工具是ThreadLocal–这使您可以拥有一个给定线程唯一的变量。因此,如果相同的代码在不同的线程中运行,那么这些执行将不会共享该值,而是每个线程都有其自己的变量,该变量对于线程而言是局部的

例如,这经常用于在Servlet中建立处理请求的上下文(例如授权信息)。您可能会执行以下操作:

private static final ThreadLocal<MyUserContext> contexts = new ThreadLocal<>();

public static MyUserContext getContext() {
    return contexts.get(); // get返回此线程唯一的变量
}

public void doGet(...) {
    MyUserContext context = magicGetContextFromRequest(request); 
    contexts.put(context); // 将上下文保存到本地线程-其他线程
                           // 拨打电话不会覆盖我们的电话
    try {
        // 商业逻辑
    } finally {
        contexts.remove(); // “确保”删除线程局部变量
    }
}

现在,您不必在MyUserContext每个方法中都使用,而可以在需要的地方使用它。当然,现在确实引入了一个需要记录的变量,但是它是线程安全的,从而消除了使用这种范围较大的变量的许多弊端。MyServlet.getContext()

这里的主要优点是,每个线程在该contexts容器中都有自己的线程局部变量。只要您从定义的入口点开始使用它(例如要求每个servlet维护其上下文,或者可能通过添加servlet过滤器),便可以在需要时依赖该上下文。