整个程序中只允许有唯一的一个对象(这个类只能实例化一次),如打印机、单核处理器等
系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。
public class Singleton {
private static Singleton SINGLETON = new Singleton();
/**
* 私有化构造器
*/
private Singleton(){
}
/**
* 获取对象
* @return
*/
public static Singleton getInstance(){
return SINGLETON;
}
}
优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
缺点:在类装载的时候就完成实例化,没有达到延迟加载的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。
public class Singleton {
private static Singleton singleton;
static{
singleton = new Singleton();
}
/**
* 私有化构造器
*/
private Singleton(){
}
/**
* 获取对象
* @return
*/
public static Singleton getInstance(){
return singleton;
}
}
这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。
public class Singleton {
private static Singleton singleton;
/**
* 私有化构造器
*/
private Singleton() {
}
/**
* 获取对象
*
* @return
*/
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
优点:实现延迟加载,并且通过双重检查保证线程安全
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
优点:避免了线程不安全,延迟加载,效率高。
public enum Singleton {
INSTANCE {
@Override
protected void read() {
System.out.println("read");
}
@Override
protected void write() {
System.out.println("write");
}
};
protected abstract void read();
protected abstract void write();
}
原文:https://www.cnblogs.com/markLogZhu/p/11438615.html