各位,大家好!
    实例代码如下:
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值为什么有的时候一样,有的时候不一样?  难道是有的时候引用同一个实例,有的时候用的不同实例?

解决方案 »

  1.   

    你run一下看看是一样的hashcode不public class TestStart {
    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.   

    LZ要明白进程的概念
    启动2个JVM就是两个不同的进程,每个进程有自己的内存空间,每个对象在自己的内存空间
    单实例的意思是在自己的进程的内存空间是唯一的,并不不是和另一个进程空间的内存一样,也就是说在第一个的JVM里有一个单实例对象,第二个进程空间里也有一个单实例对象,它们各自在自己的进程空间里,两者没有任何联系
      

  3.   

    所说的单例定 是  在同一个jvm有且只有一个 此类的对象实例.
    你的程序是运行 的时候每次启动 一个jvm.
    而hashCode默认情况下是取内存地址,所以完全有可能会不一样的hashcode.例子 可参考   snowboy8886!
      

  4.   

    举个例子class A {
        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执行不同的任务,不就乱套了吗?
      

  5.   

    对象只有在同一个JVM才能比较他们是否是同一个对象,在不同的JVM中比较同样class产生的对象是没有意义的。
    《Java与模式》中也提到,有状态的单例类在分布式JVM中,各JVM产生的实例可能是不同的,因为他们的状态可能是不同的。
    再者,hascode相同不表示对象的相同的,不同的对象可能有相同的hashcode。这就是为什么使用hash表时,必须实现haschode和equals两个方法。
    可以加入这个群聊聊设计模式:191415413
      

  6.   

    同一个类的单例在不同的JVM里就是不同的对象了