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过滤器),便可以在需要时依赖该上下文。