单例模式 = 私有的构造方法 + 私有静态的成员变量 + 一个公有的对象返回方法
首先,第一种
就是在定义私有静态的成员变量的时候,就直接将对象new出来
//饿汉式 //私有静态的成员变量 private final static Singleton INSTANCE = new Singleton(); //私有的构造方法 private Singleton(){} public Singleton getInstance(){ return INSTANCE; }然后是第二种
这种方法有一个线程安全的问题
首先看一种线程不安全的情况
//懒汉式(不可使用,存在线程安全问题) //定义静态的成员变量,但不直接new出来 private static Singleton instance =null; //私有的构造方法 private Singleton(){} public Singleton getInstance(){ if (instance == null) { instance=new Singleton(); } return instance; }这是懒汉式中最简单的一种写法,只有在方法第一次被访问时才会实例化,达到了懒加载的效果。但是这种写法有个致命的问题,这种没有加锁,存在线程安全问题。假设对象还没被实例化,然后有两个线程同时访问,那么就可能出现多次实例化的结果,所以这种写法不可采用。
在getInstance()方法上加上synchronized关键字,这样就可以达到线程安全的效果.
//懒汉式(加锁可用) //定义静态的成员变量,但不直接new出来 private static Singleton instance =null; //私有的构造方法 private Singleton(){} public synchronized Singleton getInstance(){ if (instance == null) { instance=new Singleton(); } return instance; }保证了同一时刻只能有一个线程访问并获得实例,但是缺点也很明显,因为synchronized是修饰整个方法,每个线程访问都要进行同步,而其实这个方法只执行一次实例化代码就够了,每次都同步方法显然效率低下,为了改进这种写法,就有了下面的双重检查懒汉式。
这是很多开发者推荐的一种写法,这种静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成对象的实例化。
同时,因为类的静态属性只会在第一次加载类的时候初始化,也就保证了SingletonInstance中的对象只会被实例化一次,并且这个过程也是线程安全的。
