昨天晚上在写一个局域网的聊天程序,我在服务器端定义了个Map类型的类属性,保存着用户昵称和服务器输出流之间的映射关系。然后我在客户端调用服务器端那边的类属性。程序运行的时候就乱了。最后我找了好久,在不同的地方用输出语句测试了好久(关键是用eclipse的DUBUG的时候,好像没用)。最后终于锁定是
客户端调用服务器端那边的类属性
有问题。我取不到值,输出都是null。这是为什么呢?最后我另外写了两个测试程序测试了下静态属性到底在两个不同的程序上分别运行时,数据能不能共享。

先定义个work类,里面有静态属性b

public class work { public static int b =2; public static void main(String[]
args) { System.out.println(b); b=5; } }
然后定义个Test类,在Test类的主方法里,先输出b的值,再对b进行修改。

public class Test { public static void main(String[] args) {
System.out.println(work.b); work.b=7; } }
现在我先运行Test程序,输出结果为2,这个在我的预料之中。关键是运行第二个程序work时,程序的输出类的成员变量b的值,这个属性值是多少?结果依然是2,而不是我们修改后的7.

这是怎么回事呢?怎么不是7啊?不是说好的,同一个类的所有实例的静态属性共享同一块内存区吗?第一次运行Test程序时改变了静态属性b的值,所以第二次运行程序work时,b属性也要受到影响啊!这个问题困扰了我一个晚上。测试完一看时间,12点半了。好晚了,洗洗睡吧,明天多查查资料看看。于是带着这个问题,我睡觉去了。

早上的时候,果断打开了疯狂javaPDF版。开始搜索答案。终于,皇天不负有心人,我找到了。
原来是因为运行Test和work是两次JVM进程,第一次JVM运行结束后,它对work类所做的修改将全部丢失---第二次运行JVM时将再次初始化A类。就是说,两个程序处于两个不同的JVM进程中,两个JVM之间并不会共享数据


就像程序员解决了BUG很兴奋一样,我找到了问题所在,也很兴奋。就写篇文章记录下,以防自己或者别人再遇到类似问题时,百度不到吧。说实话,这问题我还真不知道该怎么百度,怎么描述。其实遇到这问题,我是很开心的,因为我又发现了我所不懂的知识,我认为这就是程序员的成长之路,在问题中寻找答案,在寻找答案之中长知识。至于怎么解决我的局域网聊天问题,还得思考下。哎,编程之路,任重而道远。

技术
©2019-2020 Toolsou All rights reserved,
JVM内存模型(面试自用)2021年2月中国编程语言排行榜【操作系统----Linux】常用杀毒软件详解ubuntu14.04如何设置静态IP排序(一)冒泡排序法JS 的骚操作漫画 | CPU战争40年,真正的王者终于现身!python中解决字典写入列表的问题C语言控制台小游戏,打砖块SpringBoot实践(五):mybatis-plus中的BaseMapper,Iservice和ServiceImpl