有人说叫单例模式,可是这有什么关系呢,叫什么都可以。
好了进入正题,这个非常简单,就是把构造函数私有化,然后通过一个静态方法获得对象实例
(这年头对象真不好找,都是私有化的)
有一个问题就是可能会多线程的时候,导致实例化多次,解决这个问题的方法有三种:
1、同步方法,简单快捷,但是性能较差:
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static synchronized Singleton getSingleInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
2、直接实例化,简单粗暴,但是不会延时实例化。
public class Singleton1 {
public static Singleton1 uniqueInstance = new Singleton1();
private Singleton1() {}
public static Singleton1 getInstance() {
return uniqueInstance;
}
}
3、通过 同步块 与 volatile 原子操作关键字结合 双重加锁:
public class Singleton2 {
private volatile static Singleton2 uniqueInstance;
private Singleton2() {}
public static Singleton2 getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton2.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton2();
}
}
}
return uniqueInstance;
}
}
注:volatetile应不意味着真正的原子操作,在多线程涉及自身操作时会出现误差,如i++ ,结合同步块可解决此问题。