【问题标题】:static variables in multithreading多线程中的静态变量
【发布时间】:2013-07-06 06:14:54
【问题描述】:

I found that declaring a variable as static makes no sense多线程中。我认为,这是因为every thread has its own stack。这是唯一的原因吗?

我知道static variables should be used within synchronized block。但为什么呢?

【问题讨论】:

  • “毫无意义”是什么意思?
  • 我的意思是这个值在每个线程上并不通用
  • 我发现在多线程中将变量声明为静态没有意义 [citation needed]

标签: java multithreading thread-safety


【解决方案1】:

静态在多线程中没有意义。

恐怕你在做相反的陈述。静态变量是一种共享资源,可以用来在不同线程之间交换一些信息。我们在访问这样的共享资源时需要小心。因此,我们需要确保在多线程环境中对静态变量的访问是同步的。

每个线程都有自己的栈

这是一个正确的说法。 Each thread has its own stack but they share the process heap. Stack 只保存局部变量,而不保存堆上的变量。静态变量存储在堆的PermGen 部分,因此对它们的访问应该得到很好的保护。

【讨论】:

  • 那么static int a 会进入堆内存还是栈内存呢?
  • @Juned Ahsan,你能告诉我如何验证 - “线程共享进程堆。”
  • @shivam 静态变量存储在堆中,因此您可以使用不同的线程进行检查。
【解决方案2】:

由于第一部分的问题已经回答,我将尝试回答第二个问题。

我知道静态变量应该在同步块中使用。但为什么呢?

因为如果你不使用atomic,带有变量的操作就不是原子的。这就是为什么你应该在使用它们时阻止变量。但在现实世界中,您可以使用 volatile 关键字,这将保证线程将具有变量的实际值。

【讨论】:

    【解决方案3】:

    如果您在多线程环境中更改变量,新值可能不一定可见,因为它可能已被缓存。当然,静态变量也是如此。如果您不使用同步块,您可以考虑使用volatile。这也将保证各个线程获得更新的副本,而无需同步。 volatile 是否足够四个您的应用程序取决于您的要求。

    【讨论】:

      【解决方案4】:

      volatile 添加到您的静态声明中。

      volatile 将保证任何其他线程将看到变量的最新值。因此,使用 volatile 是有意义的。

      但是,volatile 不保证原子性。如果您从多个线程写入变量,您可能需要使用原子或synchronize 块。

      我认为volatile 会很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-03
        • 2012-01-15
        • 1970-01-01
        • 1970-01-01
        • 2013-08-31
        • 2013-05-18
        • 2011-07-17
        • 1970-01-01
        相关资源
        最近更新 更多