由浅入深全面解析ThreadLocal
ThreadLocal类用来提供线程内部的局部变量。这种变量在对线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。
ThreadLocal的作用是:提供线程内的局部变量,不同线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。
- 线程并发:多线程并发的场景下
- 传递数据:我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量
- 线程隔离:每个线程的变量都是独立的,不会相互影响
常用方法
方法声明 | 描述 |
---|---|
ThreadLocal() | 创建ThreadLocal对象 |
public void set( T value ) | 设置当前线程绑定的局部变量 |
public T get() | 获取当前线程绑定的局部变量 |
public void remove() | 移除当前线程绑定的局部变量 |
ThreadLocal使用案例:
package com.lwy.it;
public class ThreadLocalDemo {
ThreadLocal<String> threadLocal = new ThreadLocal<String>();
private String message;
public String getMessage() {
return threadLocal.get();
}
public void setMessage(String message) {
threadLocal.set(message);
}
public static void main(String[] args) {
ThreadLocalDemo demo = new ThreadLocalDemo();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(() -> {
demo.setMessage(Thread.currentThread().getName());
System.out.println("---------------------------");
System.out.println(Thread.currentThread().getName() + " -> " + demo.getMessage() + "的消息!");
});
thread.setName("Thread" + i);
thread.start();
}
}
}
synchronized与ThreadLocal的区别
synchronized | ThreadLocal | |
---|---|---|
原理 | 同步机制采用以时间换空间的方式,只提供了一份变量,让不同的线程排队访问 | ThreadLocal采用以空间换时间的方式,为每一个线程都提供了一份变量的副本,从而实现同时访问二相互不干扰 |
侧重点 | 多个线程之间访问资源的同步 | 多线程中让每个线程之间的数据相互隔离 |
package com.lwy.it;
// 通过synchronized方式实现功能
public class ThreadLocalDemo {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public static void main(String[] args) {
ThreadLocalDemo demo = new ThreadLocalDemo();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(() -> {
synchronized(demo) {
demo.setMessage(Thread.currentThread().getName());
System.out.println("---------------------------");
System.out.println(Thread.currentThread().getName() + " -> " + demo.getMessage() + "的消息!");
}
});
thread.setName("Thread" + i);
thread.start();
}
}
}