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
。但为什么?
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
。但为什么?
static 在多线程中毫无意义。
恐怕你在做相反的陈述。静态变量是一种共享资源,可以用来在不同线程之间交换一些信息。我们在访问这样的共享资源时需要小心。因此,我们需要确保在多线程环境中对静态变量的访问是同步的。
每个线程都有自己的栈
这是一个正确的说法。Each thread has its own stack but they share the process heap.
堆栈只保存局部变量,而不保存堆上的变量。静态变量存储在PermGen
堆的部分,因此对它们的访问应该得到很好的保护。
由于问题的第一部分已经回答,我将尝试回答第二个问题。
我知道静态变量应该在同步块中使用。但为什么?
因为如果你不使用atomic,带有变量的操作就不是原子的。这就是为什么你应该在使用它们时阻止变量。但在现实世界中,您可以使用volatile关键字,这将向您保证,线程将具有变量的实际值。
如果您在多线程环境中更改变量,则新值可能不一定可见,因为它可能已被缓存。当然,静态变量也是如此。如果您不使用同步块,则可以考虑使用volatile
。这也将保证各个线程获得更新的副本,而无需同步。您的应用程序volatile
是否足够四个取决于您的要求。
添加volatile
到您的静态声明中。
volatile
将保证任何其他线程将看到变量的最新值。因此,使用 volatile 将是有意义的。
但是,volatile
不会保证原子性。如果您从多个线程写入变量,您可能需要使用原子或synchronize
块。
我想volatile
会好的。