2011-05-12 64 views
2

是静态的变量是线程特定的,意味着静态变量是java中的线程特定的吗?

class A { 
    public static int i = 10; 
} 

Class B { 
    A.i = 20; 
} 

Class C { 
    A.i = 30; 
} 

Class D { 
    System.out.println(A.i); 
} 

以上班我从我的web应用程序,即在第一次请求调用我称之为B级,在第二次请求我把B类和第三请求我呼吁D类现在打印什么10/20/30?

谢谢。

+4

你的示例代码甚至不编译相同的值。请向我们显示编译代码。 – 2011-05-12 12:14:55

+2

我不认为编译需要的示例代码。人们发布精简版代码并不罕见。重要的是,你能够很好地了解他们正在尝试做什么。在这种情况下,你可以。 – 2011-05-12 14:12:32

回答

3

对于你的问题的正确答案(它会打印10/20/30?),假设每个请求都可能由不同的线程处理,则为“是”。

逻辑上,如果每个请求按时间顺序发生顺序,每一个不同的线程,那么你会看到20(该值不是线程专用的,我觉得你问的),但要注意,即使调用d发生时间顺序最后,它仍然可以看到值'10';该字段既不是最终的也不是波动的瓷砖,所以Java内存模型不作任何时候变到20将是其他线程可见的保证。

1

没有,他们是加载的类具体

1

静态变量是全局的,跨线程共享。这意味着,在你的榜样(B - “ç - > d)d将打印30(仅当他们被称为依次

这对同步你可能想知道的一些问题...

0

静态变量是全局性的,这意味着,无论你想和变量将有您分配给it.In的方法最终值,如果变量是私有的,你做出改变,但该方法的变量,你可以对他们的改变将具有该代码的方法的calculate.Eventually之前会告诉你30