У меня есть этот класс:
package scripts;
public class TestStatic {
public static void main(String[] args) {
new IncrA().incrStatic();
}
}
class Static {
public static int CPT = 0;
}
class IncrA{
public void incrStatic(){
for (int i:Range.ints(0,100)){
System.out.println("Now with "+this.toString()+" : Static.CPT="+Static.CPT);
Static.CPT++;
try{
Thread.sleep(100);
}
catch(Exception e){
e.printStackTrace();
}
}
System.out.println("Finally for execution of "+this.toString()+" : Static.CPT="+Static.CPT);
}
}
Теперь я дважды запускаю класс TestStatic в Java из командной строки.
javaw -cp ... scripts.TestStatic > 1.txt
javaw -cp ... scripts.TestStatic > 2.txt
Я ожидал, что первое и второе выполнения будут мешать, и в конце я получу значение для Static.CPT == 200, потому что я думал, что JVM будет загружаться только один раз в классе Static. Кажется, это не так. Хотя мне это нравится, мне интересно, достаточно ли этого примера, чтобы сделать вывод, что JVM полностью разделяет разделы. На самом деле, когда я читаю свои выходные данные, hashCode для моего объекта IncrA часто одинаков в обоих исполнениях:
От 1.txt:
...
Now with scripts.IncrA@19f953d : Static.CPT=72
Now with scripts.IncrA@19f953d : Static.CPT=73
Now with scripts.IncrA@19f953d : Static.CPT=74
Now with scripts.IncrA@19f953d : Static.CPT=75
...
От 2.txt:
...
Now with scripts.IncrA@19f953d : Static.CPT=72
Now with scripts.IncrA@19f953d : Static.CPT=73
Now with scripts.IncrA@19f953d : Static.CPT=74
Now with scripts.IncrA@19f953d : Static.CPT=75
...
@19f953d
распределяется между двумя исполнениями.
Я гуглил для глубоких объяснений статического ключевого слова, но не нашел ничего об этих проблемах. Может кто-нибудь объяснить или дать хороший указатель?