@UtilityClass public class UserHolder { /** * 当前线程用户ID * */ private static final ThreadLocal<String> userIdTL = new ThreadLocal<>(); public void setUserId(String userId) { userIdTL.set(userId); } public String getUserId() { return userIdTL.get(); } public void clear(){ userIdTL.remove(); } }
时间: 2023-12-03 19:46:33 浏览: 125
这段代码是一个线程安全的工具类,用于在多线程环境下保存当前线程的用户ID。其中,ThreadLocal是Java提供的一个线程局部变量,它能够让每个线程都拥有自己独立的变量副本,从而实现线程间数据隔离。
具体来说,这个工具类提供了三个方法:
- setUserId(String userId):将当前线程的用户ID设置为指定的值。
- getUserId():获取当前线程的用户ID。
- clear():清除当前线程的用户ID。
使用这个工具类的示例代码如下:
```
// 在当前线程中设置用户ID
UserHolder.setUserId("123");
// 在当前线程中获取用户ID
String userId = UserHolder.getUserId();
// 清除当前线程的用户ID
UserHolder.clear();
```
这样做的好处是,在多线程环境下,每个线程都可以独立地管理自己的用户ID,避免了线程之间的数据干扰和竞争。
相关问题
private static final ThreadLocal<UserInfo> userInfoThreadLocal = new ThreadLocal<>() ;
private static final ThreadLocal<UserInfo> userInfoThreadLocal = new ThreadLocal<>() 是一个Java语言中的ThreadLocal变量声明,它用于在多线程环境中存储每个线程独有的UserInfo对象。ThreadLocal是Java语言中的一个线程级别的变量,每个线程都有自己独立的ThreadLocal变量,不同的线程之间互不干扰。这个变量声明为private static final表示这个变量是一个私有、静态、不可变的常量,它只能在类内部被访问和修改。
通过使用ThreadLocal,我们可以在多线程环境下避免线程安全问题。例如,在Web应用程序中,每个请求都有一个独立的线程,我们可以使用ThreadLocal来存储当前请求的用户信息,这样就可以避免不同请求之间的用户信息相互干扰。当然,在使用ThreadLocal时也需要注意内存泄漏的问题,要及时清理不再需要使用的ThreadLocal对象。
private static final ThreadLocal<CendThreadHolder> HOLDER = new ThreadLocal<>();是什么意思
private static final ThreadLocal<CendThreadHolder> HOLDER = new ThreadLocal<>(); 这行代码定义了一个私有的静态常量ThreadLocal变量,类型为CendThreadHolder。ThreadLocal是Java中的一个线程本地变量,它可以为每个线程提供一个独立的变量副本,每个线程都可以独立地修改自己的副本,而不会影响其他线程的副本。在这个例子中,CendThreadHolder是一个自定义的类,表示线程的上下文信息。
这行代码的作用是为每个线程创建一个CendThreadHolder对象的副本,并将其存储在ThreadLocal变量HOLDER中。每个线程可以通过调用HOLDER.get()方法来获取自己的副本,通过调用HOLDER.set()方法来设置自己的副本,通过调用HOLDER.remove()方法来移除自己的副本。
这种方式可以方便地在多线程环境下共享数据,同时保证线程之间的数据隔离。每个线程都可以独立地操作自己的副本,而不会影响其他线程的副本。
示例代码如下:
```java
public class CendThreadHolder {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
public class ExampleThread extends Thread {
@Override
public void run() {
HOLDER.set(new CendThreadHolder());
HOLDER.get().setData("Hello, world!");
System.out.println(HOLDER.get().getData());
HOLDER.remove();
}
}
public class Main {
public static void main(String[] args) {
ExampleThread thread1 = new ExampleThread();
ExampleThread thread2 = new ExampleThread();
thread1.start();
thread2.start();
}
}
```
输出结果:
```
Hello, world!
Hello, world!
```