[英]Usage of Static variables in Java Servlets (e.g. in AppEngine)
[英]Usage of static variables in Java
我知道靜態變量僅在一次加載時創建和初始化,即在類加載時而不是對每個對象初始化。
在下面給出的代碼中,我想要做的是:我在類A中將一個int變量“ a”聲明為靜態,並為其分配了5的值。在執行main時,我將其值更改為6,並使程序成為無限循環。 因此,當前的“ a”值為6。
現在我想做的是,當類A仍在循環時,我嘗試從其他類類B訪問此變量,並且我希望在運行類B時應打印6(因為當我運行類B的“ a”值時)改為6),但令人驚訝的是它仍然給了我5。
即使我將“ a”聲明為靜態,為什么會發生這種情況? 無法弄清楚這種方法有什么問題。
class A{
static int a=5;
public static void main(String args[]){
System.out.println(A.a+"");
a=6;
while(true){
}
}
}
class B{
public static void main(String args[]){
System.out.println(A.a+"");
}
}
您遇到的問題是您正在運行兩個不同的JVM進程。 您應該做的是在自己的線程中運行每個“主”方法。 這樣,他們共享(因此可以修改)相同的內存。 這是修改為使用線程的示例:
public class Main{
public static int v = 5;
public static void main(String[] args) throws Exception{
new Thread(new A()).start();
Thread.sleep(5000);
new Thread(new B()).start();
}
}
class A implements Runnable{
public void run(){
System.out.println(Main.v);
Main.v = 6;
}
}
class B implements Runnable{
public void run(){
System.out.println(Main.v);
}
}
旁注:雖然此示例確實演示了該問題的預期結果,但是在編寫使用多個線程的正確 Java程序方面仍然存在很多錯誤。 做你的研究。
您永遠不會真正在A中運行主循環。
只需提出一種更改值的方法即可。
這是因為從未調用過A的main方法。
您正在運行兩個Java進程和兩個程序。 第二個類加載器加載class A
並將其靜態變量設置為5,但在class B
沒有調用可調用在class A
中定義的class A
其遞增為6的靜態main()方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.