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

ThreadLocal的目的?

邹高峻
2023-03-14
问题内容

此处给出的ThreadLocal的目的是,该变量对于任何访问包含ThreadLocal变量的对象的线程都是局部的。将ThreadLocal变量作为类的成员,然后使其成为Thread的局部变量,而不是使Thread本身具有局部变量,这有什么区别?


问题答案:

线程是执行的单元,因此多个线程可以同时执行相同的代码。如果多个线程同时在一个对象/实例上执行,它们将共享实例变量。每个线程都有其自己的局部变量,但是不传递参数就很难在对象之间共享它们。

最好通过一个例子来解释。假设您有一个Servlet,该Servlet可以获取已登录的用户,然后执行一些代码。

doGet(HttpServletRequest req, HttpServletResponse resp) {
  User user = getLoggedInUser(req);
  doSomething()
  doSomethingElse()
  renderResponse(resp)
}

现在,如果doSomething()方法需要访问用户对象怎么办?您不能使用户对象成为实例或静态变量,因为每个线程将使用相同的用户对象。您可以将用户对象作为参数传递,但这很快就会变得混乱,并且将用户对象泄漏到每个方法调用中:

doGet(HttpServletRequest req, HttpServletResponse resp) {
  User user = getLoggedInUser(req);
  doSomething(user)
  doSomethingElse(user)
  renderResponse(resp,user)
}

一个更优雅的解决方案是将用户对象放入ThreadLocal

doGet(HttpServletRequest req, HttpServletResponse resp) {
  User user = getLoggedInUser(req);
  StaticClass.getThreadLocal().set(user)
  try {
    doSomething()
    doSomethingElse()
    renderResponse(resp)
  }
  finally {
    StaticClass.getThreadLocal().remove()
  }
}

现在,任何需要用户对象的代码都可以通过从本地线程中提取来获得它,而无需使用那些讨厌的额外参数:

User user = StaticClass.getThreadLocal().get()

如果使用此方法,请注意在finally块中再次删除对象。否则,用户对象可能会在使用线程池的环境中徘徊(例如Tomcat应用程序服务器)。

编辑:静态类的代码

class StaticClass {
  static private ThreadLocal<User> threadLocal = new ThreadLocal<>();

  static ThreadLocal<User> getThreadLocal() {
    return threadLocal;
  }
}


 类似资料:
  • ThreadLocal类用于创建线程局部变量,这些变量只能由同一线程读取和写入。 例如,如果两个线程正在访问引用相同threadLocal变量的代码,则每个线程都不会看到由其他线程完成的对threadLocal变量的任何修改。 ThreadLocal方法 以下是ThreadLocal类中可用的重要方法列表。 Sr.No. 方法和描述 1 public T get() 返回当前线程的此线程局部变量副

  • 在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。 但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦: def process_student(name): std = Student(name) # std是局部变量,但是每个函数都要用它,因此必须传进去:

  • 在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。 但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦: def process_student(name): std = Student(name) # std是局部变量,但是每个函数都要用它,因此必须传进去:

  • 主要内容:1 Java.lang ThreadLocal介绍,2 Java.lang ThreadLocal声明,3 Java.lang ThreadLocal方法,4 Java.lang ThreadLocal案例1 Java.lang ThreadLocal介绍 Java ThreadLocal类提供线程局部变量。它使您能够创建只能由同一线程读取和写入的变量。如果两个线程正在执行相同的代码,并且该代码引用了ThreadLocal变量,则两个线程将看不到彼此的本地变量。 2 Java.lang

  • 问题内容: 从变量读取的速度比从常规字段读取的速度慢多少? 更具体地说,简单对象创建比访问变量快还是慢? 我认为它足够快,因此与每次创建实例相比,拥有实例要快得多。但这是否也适用于字节[10]或字节[1000]? 编辑:问题是调用get 时真正发生了什么?如果那只是一个领域,就像其他领域一样,那么答案将是“它总是最快的”,对吗? 问题答案: 运行未发布的基准测试,我的计算机上每次迭代大约需要35个

  • 我正在使用spring webflux通过Schudters.elastic()从另一个服务调用另一个服务。 在主线程中,我设置了一个InhertitableThreadlocal变量,在子线程中,我试图访问它,它工作正常。 这是我的线程本地存储类 现在的问题是它第一次工作正常,这意味着我在threadlocal中设置的值被传递给了其他服务。 但第二次,它也使用了旧id(在上次请求中生成)。 我尝