2013-07-06 47 views
3

I found that declaring a variable as static makes no sense in 多线程。我认为,这是因为every thread has its own stack。这是唯一的原因吗?我知道static variables should be used within synchronized block。但为什么?多线程中的静态变量

+0

你是什么意思'没有意义'? –

+0

我的意思是这个值在每个线程上都不常见 – R9J

+0

_I发现声明一个变量为静态在多线程中没有意义''[需要的引用]' – DaoWen

回答

11

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

我怕你正在作出反向声明。静态变量是一个共享资源,可用于在不同线程之间交换一些信息。在访问这种共享资源时我们需要小心。因此,我们需要确保在多线程环境中对静态变量的访问是同步的。

每个线程都有自己的堆栈

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

+0

是的,我没有在同步块中使用它。为什么这样? – R9J

+0

那么'static int a'会进入堆或堆栈内存吗? – ThreaT

+0

@Juned Ahsan,请你让我知道我该如何验证 - “线程共享进程堆。” – shivam

3

因为问题的第一部分已经回答了,所以我会试着回答第二个问题。

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

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

2

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

1

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

volatile将保证任何其他线程都会看到变量的最新值。所以,随着波动,这将是有道理的。

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

我认为volatile会没事的。