`

设计模式——单例模式

 
阅读更多

    关于单例模式的设计无非是尽量要实现三种特点:

        ①线程安全

        ②调用效率高

        ③实现延迟加载(真正用到的时候才去加载)

    对此kk目前总结了前辈们设计懒汉式、饿汉式、静态内部类实现式三种方式。

(1).懒汉式1.0:

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

    懒汉式1.0具有延迟加载以及调用效率高的特点,但是不具备线程安全的特点。因为一旦并发访问,如果线程A、B同时进入if代码块,A做完new初始化对象并返回instance后,B再做new初始化对象,这样就不能保证单例对象的唯一性。

 

    由此延伸出懒汉式2.0:

public class Singleton {
	private static Singleton s;
	
	private Singleton() {}
	
	public static synchronized Singleton getInstance() {
		if(s == null) {
			s = new Singleton();
		} 
		return s;
	}
}

    懒汉式2.0解决了懒汉式1.0的线程不安全问题,但是不具备调用效率高的特点。因为每一个线程调用getInstace()时都会进行synchronized的判断。

 

    由此延伸出懒汉式3.0:

public class Singleton {
	private static Singleton s;
	
	private Singleton() {}
	
	private static Object syn = new Object();
	public static Singleton getInstance() {
		if(s== null) {
			synchronized (syn) {
				if(s == null) {
					s= new Singleton();
				}
			}
		}
		return s;
	}
}

   懒汉式3.0解决了懒汉式1.0线程不安全的问题,同时也解决了懒汉式2.0调用效率不高的问题。

   解决线程不安全问题:因为当线程A、B同时进入第一个if语句块的时,A、B只能有一个进入sychronized代码块(另一个在外排队等候),当第一个线程结束后s变量已经被初始化,当另外一个进入sychronized代码块,此时进行第二重if判断s不为null,返回第一个线程创建的对象,保证了线程安全;

   解决调用效率不高的问题:因为只是在对象未初始化时才会有synchronized判断,调高了调用效率。

 

(2).饿汉式

public class Singleton1 {
	//加载类时进行初始化,天然的线程安全,这里的s只有一份
	private static Singleton1 s = new Singleton1();
	
	private Singleton1() {}
	
	//方法没有同步调用效率高
	public static Singleton1 getInstance() {
		return s;
	}
}

    饿汉式具有线程安全以及调用效率高的特点,但是缺少了延迟加载的特性。因为类加载是就会对instance进行初始化。

 

(3).静态内部类式

public class Singleton {
    private static class SingletonToGetInstance {
        private static Singleton instance = new Singleton();
    }
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        return SingletonToGetInstance.instance;
    }
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics