本文共 2748 字,大约阅读时间需要 9 分钟。
需要实例化对象的时候,使用相应的获取对象的方法,而不是通过new得到
类装载时实例化对象
在类加载的时候完成实例化,没有实现懒加载的效果
如果该实例没有被使用,则会造成内存浪费public class Singleton{ //构造器私有化 private Singleton(){ } //内部创建实例对象 private final static Singleton instance = new Singleton(); //共有静态方法,返回实例对象 public static Singleton getSingleton(){ return instance; }}
同上,代码写法有点区别
public class Singleton{ //构造器私有化 private Singleton(){ } //内部声明静态常量 private static Singleton singleton; static{ //静态代码块中创建单例对象 singleton = new Singleton(); } //共有静态方法,返回实例对象 public static Singleton getSingleton(){ return singleton; }}
起到了懒加载的效果
线程不安全
public class Singleton{ //内部声明静态常量 private static Singleton singleton; //构造器私有化 private Singleton(){ } //共有静态方法,使用该方法时创建实例对象 public static Singleton getSingleton(){ if(singleton == null){ singleton= new Singleton(); } return singleton; }}
解决了线程不安全问题
效率低
public class Singleton{ //内部声明静态常量 private static Singleton singleton; //构造器私有化 private Singleton(){ } //共有静态方法,使用该方法时创建实例对象,加锁实现线程安全 public static synchronized Singleton getSingleton(){ if(singleton == null){ singleton= new Singleton(); } return singleton; }}
不能实现线程安全
public class Singleton{ //内部声明静态常量 private static Singleton singleton; //构造器私有化 private Singleton(){ } //共有静态方法,使用该方法时创建实例对象,加锁实现线程安全 public static Singleton getSingleton(){ if(singleton == null){ //不靠谱的写法,无法保证线程安全 synchronized(Singlenton.class){ singleton= new Singleton(); } } return singleton; }}
public class Singleton{ //内部声明静态常量 private static volatile Singleton singleton; //构造器私有化 private Singleton(){ } //共有静态方法,使用该方法时创建实例对象 public static Singleton getSingleton(){ if(singleton == null){ //不靠谱的写法,无法保证线程安全 synchronized(Singlenton.class){ if(singleton == null){ singleton= new Singleton(); } } } return singleton; }}
public class Singleton{ //内部声明静态常量 private static volatile Singleton singleton; //构造器私有化 private Singleton(){ } //共有静态方法,使用该方法时创建实例对象 public static Singleton getSingleton(){ return InnerSingleton.INSTANCE; } //静态内部类 private static class InnerSingleton{ private static final Singleton INSTANCE = new Singleton(); }}
enum Singleton{ INSTANCE; //枚举类需要有方法的存在,这里这个方法就是凑数的 public void mothed(){ }}
转载地址:http://wlfli.baihongyu.com/