Haisen大王 2017-06-07 16:00 采纳率: 42.9%
浏览 713

java多线程中‘可见性’问题,是否与ThreadLocal 有关呢?

在不谈及synchronize 与 volatile 之前,
我知道线程会缓存一份 共享变量的副本,这样就导致了其它线程的可视无法确定。

我在试想这个 缓存的问题,是否与 ThreadLocal 对象有关??

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-05 23:29
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    是的,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关键字来确保共享数据是可见的。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀