Dae*_*Han 21 java static thread-safety
我对变量范围有疑问.
例如:
class A {
private static void test() {
// do something with local variables
}
}
Run Code Online (Sandbox Code Playgroud)
现在我创建两个线程,并A为每个线程创建一个实例.
当我test()在每个线程中调用时,我可以保证test()线程安全吗?
test()存储的本地变量在哪里?每个线程的堆栈?堆空间?
PS我知道静态在这种情况下完全没有意义.我在遗留代码中找到了它; 我只是想确定我所知道的!
Ero*_*rol 30
局部变量存储在每个线程自己的堆栈中.这意味着线程之间永远不会共享局部变量.这也意味着所有本地原始变量都是线程安全的.
对象的本地引用有点不同.引用本身不共享.但是,引用的对象不存储在每个线程的本地堆栈中.所有对象都存储在共享堆中.如果本地创建的对象永远不会转义它创建的方法,那么它是线程安全的.事实上,只要这些方法或对象都不会使传递的对象可用于其他线程,您也可以将其传递给其他方法和对象.
对象成员与对象一起存储在堆上.因此,如果两个线程在同一对象实例上调用方法,并且此方法更新对象成员,则该方法不是线程安全的.
线程安全检查:如果资源是在同一线程的控制下创建,使用和处置的,并且永远不会逃避对该线程的控制,则该资源的使用是线程安全的.
来自:http://tutorials.jenkov.com/java-concurrency/thread-safety.html
| 归档时间: |
|
| 查看次数: |
11697 次 |
| 最近记录: |