在不谈及synchronize 与 volatile 之前,
我知道线程会缓存一份 共享变量的副本,这样就导致了其它线程的可视无法确定。
我在试想这个 缓存的问题,是否与 ThreadLocal 对象有关??
在不谈及synchronize 与 volatile 之前,
我知道线程会缓存一份 共享变量的副本,这样就导致了其它线程的可视无法确定。
我在试想这个 缓存的问题,是否与 ThreadLocal 对象有关??
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
是的,ThreadLocal对象可以用来解决“可见性”问题。当一个线程使用ThreadLocal对象来存储共享数据时,其他线程将不会看到这个共享数据的副本,因为每个线程都会有自己的ThreadLocal对象。
以下是一个简单的例子:
public class SharedData {
private int value = 0;
public synchronized void increment() {
value++;
}
public int getValue() {
return value;
}
}
在这个例子中,只有一个线程可以在每次调用increment方法后获取到共享数据的最新值。这是因为每个线程都有自己的ThreadLocal对象,而这些对象是独立的,并且互不影响。
如果你想让多个线程同时访问共享数据,你可以创建一个全局的ThreadLocal对象,然后将它传递给所有线程:
public static final ThreadLocal<SharedData> sharedData = new ThreadLocal<>();
然后,你可以在你的代码中这样做:
public class Main {
public static void main(String[] args) throws InterruptedException {
SharedData sharedData = sharedData.get();
sharedData.increment(); // 不会被任何线程看到
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(() -> {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(sharedData.getValue());
});
thread.start();
}
}
}
这段代码将在10个线程中运行,每个线程都将打印出不同的共享数据的值,这证明了共享数据是可见的。但是,由于每个线程都有自己的ThreadLocal对象,所以它们不能互相看到对方的共享数据。
如果你想要避免这种情况,你可以使用volatile关键字或者synchronized关键字来确保共享数据是可见的。