【问题标题】:Is a static variable shared between two threads? [duplicate]两个线程之间是否共享静态变量? [复制]
【发布时间】:2015-06-17 15:02:24
【问题描述】:

在多线程程序中,如果我们有一个静态变量,那么每个线程是否都有自己的变量副本,并且在静态变量的情况下,一个线程所做的更改是否对另一个线程可见?请解释

【问题讨论】:

    标签: java


    【解决方案1】:

    所有变量1所有线程之间共享。

    只有代码可见性由变量类型(例如静态/成员、公共/私有)定义 - 而不是线程可见性。 (volatile 修饰符会影响线程访问,但它本身通常是不够的。)

    使用正确的同步(和/或 volatile 变量)对于变量的“线程安全”访问是必需的,并且所有可以从中访问的数据可以被多个线程访问。如果没有正确的同步,就不能保证另一个线程会“看到”对 [静态] 变量的更改。


    1 可以创建ThreadLocal '变量'(通过间接对象),但这应该很少见。

    【讨论】:

    • 所有变量当然除了局部变量和方法参数。
    【解决方案2】:

    在多线程程序中,如果我们有一个静态变量,那么每个线程是否都有自己的变量副本

    没有。如果需要,可以使用ThreadLocal

    在静态变量的情况下,一个线程所做的更改对另一个线程可见

    不是马上。另一个线程可能仍缓存旧值。为保证更改对其他线程可见,您有多种选择。您可以使用锁、synchronized 块/方法、创建变量 volatile 或使用一些现有的线程安全实用程序类,例如 AtomicReference

    【讨论】:

      【解决方案3】:

      如果多个线程访问同一个静态变量,所有线程都可以看到变化。

      因此,如果多个线程正在访问同一个变量,您将需要为该变量使用锁以保证线程安全。

      【讨论】:

        【解决方案4】:

        是的,与局部变量不同,静态变量在线程之间共享。 更多参考:http://java67.blogspot.com/2012/11/what-is-static-class-variable-method.html

        【讨论】:

        • @suseika 答案的基本部分已经在这里。你的评论是什么意思?这不是仅链接的答案。在我看来,这实际上是目前最好的答案。
        【解决方案5】:

        有一个经典的例子----生产者和消费者。这启发我们,如果要在其他线程中发现变量的变化,必须考虑每个线程在 CPU 中的占有时间。 EX:变量可能只是在一个线程中更改,而另一个线程没有使用CPU,因此找不到更改。 当然,你可以使用

            synchronized
        

        限制线程改变静态变量的行为(多线程时)。但是你必须知道CPU的交叉使用,这意味着如果你没有明确定义它们的优先级,你就不知道多个线程的运行方式。

        【讨论】:

          猜你喜欢
          • 2011-06-23
          • 1970-01-01
          • 2013-06-20
          • 1970-01-01
          • 2019-03-29
          • 1970-01-01
          • 1970-01-01
          • 2013-11-28
          相关资源
          最近更新 更多