gpt4 book ai didi

java - 线程会使用传入的旧值吗?

转载 作者:行者123 更新时间:2023-11-30 03:56:17 24 4
gpt4 key购买 nike

刚想到这个问题,找不到答案

如果我将一个静态非原始变量,比如 X,传递给一个稍后启动的线程(因此人们会假设该线程持有对 X 的引用),是否有可能当线程启动时,而不是从内存中读取 X 时,它可能会使用 X 传递给线程时的旧值

或类似的场景:

thread A runs and writes X = a to RAM, then gets blocked by IO

thread B reads X = a from RAM, queues a unit of work to A, which would use X

thread A resumes and writes X = b to RAM, then it finishes what it had left

...

thread A resumes and runs that unit of work queued to it, which would use X

Is it possible that X would have the value a?

如果是的话,主流平台上的C、C++、Java、C#等主流语言有可能实现吗? (用于 java 的 jvm 的所有版本以及用于 C# 的 .Net 和 Mono 的所有版本)?

我不希望发生这种情况,但很好奇它是否会在任何流行的平台上发生,可能会导致疯狂的编译器优化、缓存(总是有可能)、极其便宜的硬件等

最佳答案

我觉得你有点糊涂了。程序不会将数据从内存中读入……其他东西(说真的,你认为它会去哪里?)。它总是从内存中读取。

每时每刻。所以不,您的情况根本不可能。它将始终具有更新的值。

快速免责声明,变量/数据总是可以由 CPU 缓存以避免 RAM 命中,所以如果硬件没有同步,这可能会发生,但这不是语言的问题/运行。 “内存”的软件概念包括RAM、缓存和虚拟内存。

关于java - 线程会使用传入的旧值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28634788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com