package edu.scit.singletion;public class Singletion {
public static Singletion singletion;

//专用的构造器,防止客户机创建多个实例
private Singletion(){

}

//设计唯一的访问接口
public static synchronized Singletion getInstance(){
if(singletion== null){
singletion = new Singletion();
}
return singletion;
}

public void print(){
System.out.println("==========hello==========");
}
public String toString(){
return "king";

}
}
class test{
public static void main(String [] args){
Singletion s =Singletion.getInstance();
s.print();
System.out.println(s.getClass());
Singletion s1 =Singletion.getInstance();
System.out.println(s1.getClass());
}
}请问这样可以证明我写的代码是单例模式吗==========hello==========
class edu.scit.singletion.Singletion
class edu.scit.singletion.Singletion

解决方案 »

  1.   

    应该调用哪个方法来判断是不是同一个实例啊hashcode()可以吧 class test{
    public static void main(String [] args){
    Singletion s =Singletion.getInstance();
    s.print();
    System.out.println(s.hashCode());
    Singletion s1 =Singletion.getInstance();
    System.out.println(s1.hashCode());
    }
    }输出结果是
    ==========hello==========
    12677476
    12677476
      

  2.   

    if(singletion== null){ 
    singletion = new Singletion(); 

    return singletion; 
    } 这部分加个线程锁如何?
      

  3.   

    这是典型的单例模式
    s和s1是引用,实际上指向了同一个堆地址
    如果要测试可以在类中加工静态变量
    public static int count = 0;
    然后在私有函数加上
    count++;
    你在看count的值是1 就是单例了
      

  4.   

    这个是单例,但是防止序列化出问题,最好加一个
    public Object readResolve(){return Singletion ; }
      

  5.   

    class test{ 
    public static void main(String [] args){ 
    Singletion s =Singletion.getInstance(); 
    s.print(); 
    System.out.println(s.getClass()); 
    Singletion s1 =Singletion.getInstance(); 
    System.out.println(s1.getClass()); 

    System.out.println(s1==s); //这样就证明是单例啊getClass只是返回类名,不是实例啊
      

  6.   

    这种方式可能产生多线程的问题,也就是说可能有多个实例产生虽然几率很小.但是在这种情况下加把锁可以有效的防止这种情况的发生.产生并发原因可以参考下http://hi.baidu.com/arraystar/blog/item/228f06dab30c563c33fa1ca7.html