各位,大家好!
实例代码如下:
public class TestStart {
public static void main(String[] args) throws Exception {
JobStartNew jn=JobStartNew.getInstance();
System.out.println(i+"--"+jn.hashCode()); //打印出jn的hashcode值,判断是否是同一对象
Thread.sleep(20000); }}
public class JobStartNew {
private static JobStartNew instance=new JobStartNew();
private JobStartNew(){};
public static JobStartNew getInstance(){
return instance;
}
} 我前后两次执行了main方法,也就是开启了两个jvm进程,而且两个jvm进程都未消亡,这个时候打印出的hashcode值为什么有的时候一样,有的时候不一样? 难道是有的时候引用同一个实例,有的时候用的不同实例?
实例代码如下:
public class TestStart {
public static void main(String[] args) throws Exception {
JobStartNew jn=JobStartNew.getInstance();
System.out.println(i+"--"+jn.hashCode()); //打印出jn的hashcode值,判断是否是同一对象
Thread.sleep(20000); }}
public class JobStartNew {
private static JobStartNew instance=new JobStartNew();
private JobStartNew(){};
public static JobStartNew getInstance(){
return instance;
}
} 我前后两次执行了main方法,也就是开启了两个jvm进程,而且两个jvm进程都未消亡,这个时候打印出的hashcode值为什么有的时候一样,有的时候不一样? 难道是有的时候引用同一个实例,有的时候用的不同实例?
public static void main(String[] args) throws Exception { JobStartNew jn1 = JobStartNew.getInstance();
JobStartNew jn2 = JobStartNew.getInstance();
JobStartNew jn3 = JobStartNew.getInstance();
System.out.println("jn1--" + jn1.hashCode());
Thread.sleep(2000);
System.out.println("jn2--" + jn2.hashCode());
Thread.sleep(2000);
System.out.println("jn3--" + jn3.hashCode());
}
}
启动2个JVM就是两个不同的进程,每个进程有自己的内存空间,每个对象在自己的内存空间
单实例的意思是在自己的进程的内存空间是唯一的,并不不是和另一个进程空间的内存一样,也就是说在第一个的JVM里有一个单实例对象,第二个进程空间里也有一个单实例对象,它们各自在自己的进程空间里,两者没有任何联系
你的程序是运行 的时候每次启动 一个jvm.
而hashCode默认情况下是取内存地址,所以完全有可能会不一样的hashcode.例子 可参考 snowboy8886!
private static A a = new A();
public static int i = 10;
public static A getA() {return a;}
}public class Test1 {
public static void main(String[] args) throws Throwable {
A a = A.getA();
a.i = 100;
Thread.sleep(60*1000);
}
}public class Test2 {
public static void main(String[] args) throws Throwable {
A a = A.getA();
System.out.println(a.i);
}
}
分别调用
java Test1
java Test2
看看,启动两个JVM,就知道,Test2里的a.i并不受Test1的a.i的改变的影响
不同的JVM之间的内存是互不干扰的,否则,一台机器启动不同的JVM执行不同的任务,不就乱套了吗?
《Java与模式》中也提到,有状态的单例类在分布式JVM中,各JVM产生的实例可能是不同的,因为他们的状态可能是不同的。
再者,hascode相同不表示对象的相同的,不同的对象可能有相同的hashcode。这就是为什么使用hash表时,必须实现haschode和equals两个方法。
可以加入这个群聊聊设计模式:191415413