我有一个关于变量范围的问题。
例如:
class A {
private static void test() {
// do something with local variables
}
}
现在,我让两个线程,创造的一个实例A
为每个线程。
当我打电话test()
在每个线程,我可以保证test()
是线程安全的?
凡在本地变量下的test()
存储在哪里? 每个线程的堆栈? 堆空间?
PS我知道,静态就是在这种情况下,完全没有意义的。 我发现它在我们的遗留代码; 我只是想确保我所知道的!
局部变量存储在每个线程的自己的堆栈。 这意味着,局部变量从未线程之间共享。 这也意味着,所有本地原始变量是线程安全的。
对对象的本地引用是有点不同。 基准本身不被共享。 然而,所引用的对象,是不是存储在每个线程的本地堆栈。 所有的对象被存储在共享堆。 如果在本地创建一个从来没有逃脱对象创建它的方法,它是线程安全的。 事实上,你也可以,只要这些方法都没有或对象提供给其他线程传递的对象传递给其他方法和对象。
对象成员与对象一起存储在堆上。 因此,如果两个线程调用同一对象实例的方法和该方法的更新对象成员,该方法不是线程安全的。
线程安全检查:如果资源被创建,使用并设置在同一个线程的控制范围内,从来没有逃脱这个线程的控制,使用该资源是线程安全的。
来源: http://tutorials.jenkov.com/java-concurrency/thread-safety.html
当我在每个线程调用测试(),我可以保证测试()是线程安全的?
是的,它会如果测试()方法,则需要在方法的局部变量的工作是线程安全的。
凡在测试本地可变因素()存储? 每个线程的堆栈? 堆空间?
方法本地变量存储每个线程的自己的堆栈。
对于1号,我不知道什么test()
不会,所以我不能回答。 如果他们修改了一些static
类A的变量,那么它可能不是线程安全的。 如果一路上两个线程都给出参考相同的对象,根据对象是如何定义的,它可能不是线程安全的。
对于2号,局部变量是在每个线程(或至少在概念上类似的)的叠层,所以没有担心的局部变量被其他线程修改。