ThreadLocal是一个泛型类,用在线程之外定义线程本地变量。
package com.example.demo.multithread;
public class ThreadLocalDemo {
private static final ThreadLocal<String> threadLocalMessage = new ThreadLocal<String>();
private static String message;
private static final int NUM = 10;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
for (int i = 0; i < NUM; i++) {
message = "1";
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!message.equals("1")) {
System.out.println(Thread.currentThread().getName() + ": message is overwritten!");
}
}
}, "t1").start();
new Thread(() -> {
for (int i = 0; i < NUM; i++) {
message = "2";
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!message.equals("2")) {
System.out.println(Thread.currentThread().getName() + ": message is overwritten!");
}
}
}, "t2").start();
new Thread(() -> {
for (int i = 0; i < NUM; i++) {
threadLocalMessage.set("3");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!threadLocalMessage.get().equals("3")) {
System.out.println(Thread.currentThread().getName() + ": message is overwritten!");
}
}
}, "t3").start();
new Thread(() -> {
for (int i = 0; i < NUM; i++) {
threadLocalMessage.set("4");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!threadLocalMessage.get().equals("4")) {
System.out.println(Thread.currentThread().getName() + ": message is overwritten!");
}
}
}, "t4").start();
}
}