public class StackClosedDemo {
// 每个线程调用该方法时,都会创建独立的count副本
public void calculate() {
int count = 0;
count++; // 无线程安全问题
System.out.println(Thread.currentThread().getName() + ": " + count);
}
public static void main(String[] args) {
StackClosedDemo demo = new StackClosedDemo();
// 10个线程各自操作自己的局部变量
for (int i = 0; i < 10; i++) {
new Thread(demo::calculate, "Thread-" + i).start();
}
}
}
不可变对象:对象创建后状态不可修改(如String、Integer),即使共享也无法修改值。
java复制代码
// 自定义不可变类(final类+final成员变量+无setter)
public final class ImmutableUser {
private final String name;
private final int age;
public ImmutableUser(String name, int age) {
this.name = name;
this.age = age;
}
// 仅提供getter,无setter
public String getName() { return name; }
public int getAge() { return age; }
}
ThreadLocal(线程本地存储):为每个线程提供独立的变量副本,线程操作自身副本,互不干扰。
java复制代码
public class ThreadLocalDemo {
// 每个线程有独立的Integer副本,初始值为0
private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
public void increment() {
threadLocal.set(threadLocal.get() + 1);
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
}
public static void main(String[] args) {
ThreadLocalDemo demo = new ThreadLocalDemo();
// 3个线程各自操作自己的副本
for (int i = 0; i < 3; i++) {
new Thread(() -> {
for (int j = 0; j < 2; j++) {
demo.increment();
}
}, "Thread-" + i).start();
}
}
}
// 输出(顺序可能不同):
// Thread-0: 1、Thread-0: 2
// Thread-1: 1、Thread-1: 2
// Thread-2: 1、Thread-2: 2