Java ThreadLocal 举例
Java ThreadLocal 被用来创建线程局部变量。
Object的所有线程都共享它的变量,因此变量不是线程安全的。
我们可以通过同步来实现线程安全
这里提供另一个方法,ThreadLocal
Java ThreadLocal
每个线程都有自己的ThreadLocal变量,可以使用 get() 和 set() 方法来获取默认值或将其值更改为本地的Thread值
ThreadLocal实例通常将状态与线程相关联的类中的私有静态字段。
package coreofjava.javathread.threadlocal;
import java.text.SimpleDateFormat;
import java.util.Random;
public class ThreadLocalExample implements Runnable {
private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
public static void main(String[] args) throws InterruptedException {
ThreadLocalExample obj = new ThreadLocalExample();
for (int i = 0; i < 10; i++) {
Thread t = new Thread(obj, "" + i);
Thread.sleep(new Random().nextInt(1000));
t.start();
}
}
@Override
public void run() {
System.out.println("Thread Name = " + Thread.currentThread().getName() + " default Formatter = " + formatter.get().toPattern());
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
formatter.set(new SimpleDateFormat());
System.out.println("Thread Name = " + Thread.currentThread().getName() + " formatter = " + formatter.get().toPattern());
}
}
运行结果
Thread Name = 0 default Formatter = yyyyMMdd HHmm
Thread Name = 1 default Formatter = yyyyMMdd HHmm
Thread Name = 1 formatter = yy-M-d ah:mm
Thread Name = 2 default Formatter = yyyyMMdd HHmm
Thread Name = 0 formatter = yy-M-d ah:mm
Thread Name = 3 default Formatter = yyyyMMdd HHmm
Thread Name = 3 formatter = yy-M-d ah:mm
Thread Name = 2 formatter = yy-M-d ah:mm
Thread Name = 4 default Formatter = yyyyMMdd HHmm
Thread Name = 4 formatter = yy-M-d ah:mm
Thread Name = 5 default Formatter = yyyyMMdd HHmm
Thread Name = 5 formatter = yy-M-d ah:mm
Thread Name = 6 default Formatter = yyyyMMdd HHmm
Thread Name = 7 default Formatter = yyyyMMdd HHmm
Thread Name = 8 default Formatter = yyyyMMdd HHmm
Thread Name = 6 formatter = yy-M-d ah:mm
Thread Name = 7 formatter = yy-M-d ah:mm
Thread Name = 9 default Formatter = yyyyMMdd HHmm
Thread Name = 9 formatter = yy-M-d ah:mm
Thread Name = 8 formatter = yy-M-d ah:mm