一般七种,常见三种:懒汉式。恶汉式,枚举;
恶汉式:
不管之前有没有该对象,静态代码中直接new一个创建;
public class Singleton {
private static Singleton s1 = new Singleton();
public static Singleton getSington(){
return s1;
}
}
public class a {
public static void main(String[] args) {
Singleton s1 = Singleton.getSington();
Singleton s2 = Singleton.getSington();
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
366712642
366712642
哈希值一样,为同一个对象。
懒汉式:
public class Singleton2 {
private static Singleton2 s1=null;
public Singleton2() {
}
public static Singleton2 getSington(){
if (s1==null) {
synchronized (Singleton2.class) {
if (s1==null) {
s1=new Singleton2();
}
}
}
return s1;
}
}
测试方法:
public class SingleTest {
public static void main(String[] args) {
Singleton2 s1 = Singleton2.getSington();
Singleton2 s2 = Singleton2.getSington();
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
输出:
2143192188
2143192188
枚举:enum
这个最容易写,也最安全,一般在业务场景是被北向系统调用的时可以这样用;不会被通过暴力反射拿到。
public enum Singleton3 {
single,yellow,blue; //把需要定义为单例的类在此列举,用逗号隔开,获取的时候每一个都是单例;
}
测试方法:
public class SingleTest {
public static void main(String[] args) {
Singleton3 s1 = Singleton3.single;
Singleton3 s2 = Singleton3.single;
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
Singleton3 s3 = Singleton3.yellow;
Singleton3 s4 = Singleton3.yellow;
System.out.println(s3.hashCode());
System.out.println(s4.hashCode());
Singleton3 s5 = Singleton3.blue;
Singleton3 s6 = Singleton3.blue;
System.out.println(s5.hashCode());
System.out.println(s6.hashCode());
}
}
结果:
366712642
366712642
1829164700
1829164700
2018699554
2018699554