列举5种单例模式的实例,从实例代码中感受单例模式的魅力。
第一种,懒汉式 ,实现简单,但是线程不安全
package com.wms.singleton;
/**
* @date:2018/11/12
* @desc: //懒汉式 线程不安全
*/
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
return new Singleton();
}
return instance;
}
}
第二种,改进懒汉式,通过加上synchronized关键字实现线程安全,但是getInstance方法变得低效。
package com.wms.singleton;
/**
* @date:2018/11/12
* @desc: //懒汉式升级 线程安全 通过加synchronized关键字,实现多线程安全,但是效率低
*/
public class Singleton01 {
private static Singleton01 instance;
private Singleton01() {
}
public static synchronized Singleton01 getInstance() {
if (instance == null) {
return new Singleton01();
}
return instance;
}
}
第三种,懒汉式进一步升级,通过下沉synchronized关键字,实现模块同步,在保证线程安全的情况下,提高了效率。
package com.wms.singleton;
/**
* @date:2018/11/12
* @desc: 懒汉式再升级 双校验式 多线程安全,效率也高
*/
public class Singleton02 {
private static Singleton02 instance;
private Singleton02() {
}
public static Singleton02 getInstance() {
if (instance == null) {
synchronized (Singleton02.class) {
if (instance == null) {
return new Singleton02();
}
}
}
return instance;
}
}
第四种,饿汉式,简单实现,效率高,但是在类加载时候就实例化对象,如果instance比较大,就很占内存。
package com.wms.singleton;
/**
* @date:2018/11/12
* @desc: 饿汉式 多线程安全,但比较占内存
*/
public class Singleton03 {
private static Singleton03 instance = new Singleton03();
private Singleton03() {
}
public static Singleton03 getInstance() {
return instance;
}
}
第五种,改进饿汉式,通过内部静态类,延迟实例化对象,提高性能。
package com.wms.singleton;
/**
* @date:2018/11/12
* @desc: 饿汉式升级 :登记式,静态内部类式
*
* 加载Singleton04 类时不会实例化instance,实现延时加载,当instance占用资源大时狠适合。
*/
public class Singleton04 {
private static class Singletoninner {
private static final Singleton04 INSTANCE= new Singleton04();
}
private Singleton04() {
}
public static Singleton04 getInstance() {
return Singletoninner.INSTANCE;
}
}