300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > java 线程 静态变量_线程之间是否共享静态变量?

java 线程 静态变量_线程之间是否共享静态变量?

时间:2020-05-13 19:36:23

相关推荐

java 线程 静态变量_线程之间是否共享静态变量?

问题

我的老师在一个关于线程的上层java课上说了一些我不确定的东西。

他表示以下代码不一定会更新2910104598变量。根据他的说法,两个线程不一定共享静态变量,特别是在每个线程(主线程与ReaderThread)在其自己的处理器上运行并因此不共享相同的寄存器/缓存/等的情况下CPU不会更新另一个。

基本上,他说有可能ready在主线程中更新,但不在ReaderThread中更新,因此ReaderThread将无限循环。他还声称该程序可以打印'0'或'42'。我知道如何打印'42',但不能打印'0'。他提到当number变量设置为默认值时会出现这种情况。

我想也许不能保证在线程之间更新静态变量,但这对我来说非常奇怪。 makereadyvolatile正确吗?

他展示了这段代码:

public class NoVisibility {

private static boolean ready;

private static int number;

private static class ReaderThread extends Thread {

public void run() {

while (!ready) Thread.yield();

System.out.println(number);

}

}

public static void main(String[] args) {

new ReaderThread().start();

number = 42;

ready = true;

}

}

#1 热门回答(59 赞)

静态变量没有特定的可见性问题。 JVM的内存模型强调了可见性问题.Here's an article talking about the memory model and how writes become visible to threads。你不能指望一个线程及时变得对其他线程可见的更改(实际上JVM没有义务让这些更改完全可见),除非你建立ahappens-before relationship,这里是该链接的引用(提供)在Jed Wesley-Smith的评论中):

Java语言规范的第17章定义了内存操作的先发生关系,例如共享变量的读写。只有在读取操作之前发生写入操作时,一个线程的写入结果才能保证对另一个线程的读取可见。 synchronized和volatile构造以及Thread.start()和Thread.join()方法可以形成先发生关系。特别是:线程中的每个动作都发生在该线程中的每个动作之前,该动作在程序的顺序中稍后出现。监视器的解锁(同步块或方法退出)发生在同一监视器的每个后续锁定(同步块或方法入口)之前。并且因为发生在之前的关系是可传递的,所以在解锁之前线程的所有动作都发生在任何线程锁定该监视器之后的所有动作之前。对易失性字段的写入发生在每次后续读取该相同字段之前。易失性字段的写入和读取具有与进入和退出监视器类似的内存一致性效果,但不需要互斥锁定。在启动线程中的任何操作之前发生对线程启动的调用。线程中的所有操作都发生在任何其他线程从该线程上的连接成功返回之前。

#2 热门回答(28 赞)

他在谈论可见性而不是太过于字面意思。

静态变量确实在线程之间共享,但是在一个线程中进行的更改可能不会立即对另一个线程可见,使得看起来有两个变量副本。

本文提供了一个与他如何呈现信息一致的视图:

//11/what-volatile-means-in-java.html

首先,你必须了解Java内存模型的一些内容。多年来我一直在努力解释一下这个问题。截至今天,我能想到的最好的方式是描述它:如果你用这种方式想象它:Java中的每个线程都发生在一个单独的存储空间中(这显然是不真实的,所以请耐心等待这一点)。你需要使用特殊机制来保证在这些线程之间进行通信,就像在消息传递系统上一样。在一个线程中发生的内存写入可以"泄漏"并被另一个线程看到,但这绝不是保证。如果没有明确的通信,你无法保证其他线程可以看到哪些写入,甚至无法保证看到它们的顺序。 ...

但同样,这只是思考线程和易失性的心理模型,而不是字面上JVM的工作方式。

#3 热门回答(9 赞)

基本上它是真的,但实际上问题更复杂。共享数据的可见性不仅会受到CPU缓存的影响,还会受到指令的无序执行的影响。

因此,Java定义了aMemory Model,它指出线程在哪种情况下可以看到共享数据的一致状态。

在你的特定情况下,添加volatile保证可见性。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。