【问】java内存模型问题,高手请进,问题如下,感谢!
java吧
全部回复
仅看楼主
level 9
葬花逐流 楼主
现在有一个类:class A{ public static int a=1; },现在用2个类,分别对类A中的变量a进行操作,然后打印出a的值。
class B{
public static void main(String[] args){
A.a += 1;
System.out.println(A.a);
}
}
class C{
public static void main(String[] args){
System.out.println(A.a);
}
}
分别运行B、C,分别会输出:2、1。
请问,2次运行创建了2个线程,在2个线程中分别调用了类A的static field,在第一个线程运行结束后,类A的static field为什么被重置了?我们知道类被加载之后,紧接着就会执行链接、初始化,这时,类的static field就有了值,那现在,是因为第2个线程重新初始化了类A、将静态区内存中的A.a的值重置了么?还是重新为类A分配了静态区内存(应该不是重新分配内存吧)?
2014年07月01日 03点07分 1
level 12
你确定A没释放?
2014年07月01日 04点07分 2
你是说第一个线程调用完类A之后,第二个线程再次调用类A的时候,类A被重新链接 分配新内存并赋了对应类型的默认值、然后合并到jre中了?之前的方法区中的类A 占用的内存被释放了?
2014年07月01日 04点07分
[狂汗]明明是2个进程。。。我错了!
2014年07月01日 08点07分
level 14
楼主请你告诉我这玩意怎么运行?...[温暖]
2014年07月01日 04点07分 3
哦,看错了,原来是两个类,那这和内存模型一点关系都没有了。两次运行而已
2014年07月01日 04点07分
恩,我想了下,类在JVM里面有以下几个阶段:加载 -- 连接 -- 初始化 -- 使用 -- 卸载。当我们的第一个jvm线程调用完类A之后,类A就已经没有被任何类/方法调用了,这时就被卸载了,它的内存就被回收了;当第2个jvm线程再次调用类A时,类A被重新连接 分配内存了,所以在第2个线程里A.a的值还是1。
2014年07月01日 04点07分
level 12
[黑线]槽,我还以为是多线程同步的问题,这哪里是两个线程,根本就是两个进程,JVM都启动了两次了,上次启动时候的资源早都已经全部释放掉了。
2014年07月01日 07点07分 6
哦对,我看了本书上说是2个线程,就感觉有点别扭,明明是2个进程。。。[真棒]
2014年07月01日 08点07分
level 7
2个main()程序分别运行,A类的static a 被创建了两次,有单独的地址空间
猜的~~~
2014年07月01日 07点07分 7
1