参考http://blog.csdn.net/jason0539/article/details/23297037/
概念:
java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
饿汉式单例:饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
public class Singleton{
private Singleton(){}
private static Singleton insatnce=new Singleton();
public static Singleton getInstance(){
return insatnce;
}
}
Singleton 类只有一个构造函数,它被private修饰,客户无法创建该类的实例。
此实现是线程安全的,这是因为当JVM在加载此类时,对于static属性的初始化只能由一个线程执行且只执行一次。
懒汉式单例:
//懒汉式单例类.在第一次调用的时候实例化自己
- public class LazySingleton {
- private LazySingleton() {}
- private static LazySingleton single=null;
- //静态工厂方法
- public static LazySingleton getInstance() {
- if (single == null) {
- single = new LazySingleton();
- }
- return single;
- }
- }
懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例,要实现线程安全,有以下三种方式,都是对getInstance这个方法改造,保证了懒汉式单例的线程安全。
1、在getInstance方法上加同步
- public static synchronized Singleton getInstance() {
- if (single == null) {
- single = new Singleton();
- }
- return single;
- }
但是加synchronized会使得性能大不如前。
2、双重检查锁定
private volatile static Singleton single=null;
- public static Singleton getInstance() {
- if (singleton == null) {
- synchronized (Singleton.class) {
- if (singleton == null) {
- singleton = new Singleton();
- }
- }
- }
- return singleton;
- }
代码解释
3、静态内部类
- public class Singleton {
- private static class LazyHolder {
- private static final Singleton INSTANCE = new Singleton();
- }
- private Singleton (){}
- public static Singleton getInstance() {
- return LazyHolder.INSTANCE;
- }
- }
当JVM加载Singleton时,由于此类没有static,所以加载完成后就返回,只有在第一次调用getInstance时,JVM才会加载LazyHolder类,才会初始化Singleton。