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
。但为什么?多线程中的静态变量
3
A
回答
11
静态在多线程中没有意义。
我怕你正在作出反向声明。静态变量是一个共享资源,可用于在不同线程之间交换一些信息。在访问这种共享资源时我们需要小心。因此,我们需要确保在多线程环境中对静态变量的访问是同步的。
每个线程都有自己的堆栈
这是一个正确的说法。 Each thread has its own stack but they share the process heap.
堆栈仅保存局部变量而不保存堆中的变量。静态变量存储在堆的PermGen
部分,因此应该很好地保护对它们的访问。
3
因为问题的第一部分已经回答了,所以我会试着回答第二个问题。
我知道应该在同步块内使用静态变量。但为什么?
因为如果您不使用atomic,变量的操作不是原子的。这就是为什么你应该在处理变量时阻止变量。但在现实世界中,您可以使用易失性关键字,这将保证您的线程将具有实际的变量值。
2
如果您在多线程环境中更改变量,则新值可能并不需要visibile,因为它可能会被缓存。当然对于静态变量也是如此。如果您不使用同步块,则可以考虑使用volatile
。这也将保证各个线程获得更新的副本,而不需要同步。 Wether volatile
已经足够四个您的应用程序取决于您的要求。
1
将volatile
添加到您的静态声明中。
volatile
将保证任何其他线程都会看到变量的最新值。所以,随着波动,这将是有道理的。
但是,volatile
不能保证原子性。如果您从多个线程写入变量,则可能需要使用原子或synchronize
块。
我认为volatile
会没事的。
相关问题
- 1. 静态变量和多线程
- 2. 线程和静态变量
- 3. Python静态线程变量
- 4. C#线程静态变量
- 5. 跨多个线程的可变静态变量
- 6. 访问多线程系统中的静态变量
- 7. 在多线程中共享数据 - 是非静态变量吗?
- 8. 两线程共享静态变量
- 9. 使用线程递增静态变量
- 10. C#静态变量跨线程访问
- 11. 静态类中的静态变量和非静态类中的静态变量
- 12. 静态方法,静态变量可以通过web应用程序中的多个线程进行变异 - jsp
- 13. 本地静态变量和多线程 - 是否安全?
- 14. 静态变量和多线程在Objective-C
- 15. 多线程和静态块
- 16. Java线程有两个线程和静态变量
- 17. C++类中的非静态多线程
- 18. 静态函数中的静态变量?
- 19. 静态变量是java中的线程特定的吗?
- 20. 改变应用程序线程静态变量没有效果
- 21. 静态函数和多线程中的C++静态成员
- 22. 静态局部变量的线程安全增量
- 23. 用于C++中线程计数的静态类变量
- 24. 这是ASP.net中的静态变量线程安全c#
- 25. JUnit使用Java中的静态变量运行线程
- 26. PHP:引用静态变量中的另一个静态变量
- 27. 全局静态变量vs函数中的静态变量?
- 28. 同一类中的Java静态变量和非静态变量
- 29. 如何初始化多线程上下文中的静态变量?
- 30. PHP中的静态变量变量
你是什么意思'没有意义'? –
我的意思是这个值在每个线程上都不常见 – R9J
_I发现声明一个变量为静态在多线程中没有意义''[需要的引用]' – DaoWen