一、单例模式-饿汉模式
package com.xm.designpattern.single;
/**
* 单例模式-饿汉模式
* 原理: 不管是否使用,类加载时就初始化好
* 缺点: 非线程安全,只适合单线程使用
* @author ouyangjun
*
*/
public class HungrySingle {
private HungrySingle hungrySingle = new HungrySingle();
public HungrySingle getInstance(){
return hungrySingle;
}
}
二、单例模式-懒汉模式
package com.xm.designpattern.single;
/**
* 单例模式-懒汉模式
* @author ouyangjun
*/
public class LazySingle {
/**
* 原理: 在需要用到实例的时候才去创建
* 缺点: 非线程安全,只适合单线程使用
* @return
*/
private LazySingle lazySingle = null;
public LazySingle getInstance(){
if(lazySingle==null){
lazySingle = new LazySingle();
}
return lazySingle;
}
/**
* 原理: 在需要用到实例的时候才去创建
* 缺点: 线程安全,可多线程使用,但比较消耗性能,因为不是所有情况都需要同步
* @return
*/
private LazySingle lazySingleSafe = null;
public synchronized LazySingle getInstanceSafe(){
if(lazySingleSafe==null){
lazySingleSafe = new LazySingle();
}
return lazySingleSafe;
}
}
三、单例模式-懒汉模式,双重安全校验
package com.xm.designpattern.single;
/**
* 单例模式-懒汉模式,双重安全校验
* 原理: 当实例为空的时候,先锁定,再创建实例,再放开锁,原理上是没问题的,可使用
* 缺点: 多重校验,容易出错
* @author ouyangjun
*/
public class DoubleLazySingle {
private DoubleLazySingle doubleLazySingle = null;
public DoubleLazySingle getInstance(){
if(doubleLazySingle==null){
synchronized(DoubleLazySingle.class){
if(doubleLazySingle==null){
doubleLazySingle = new DoubleLazySingle();
}
}
}
return doubleLazySingle;
}
}
四、单例模式-内部类实现(推荐使用)
package com.xm.designpattern.single;
/**
* 单例模式-内部类实现
* 原理: 单列初始化不会加载,在调用getInstance()方法时才进行加载,推荐使用
* @author ouyangjun
*/
public class InternalClassSingle {
private static class InternalClassSingleHolder {
private static InternalClassSingle internalClassSingle = new InternalClassSingle();
}
public InternalClassSingle getInstance() {
return InternalClassSingleHolder.internalClassSingle;
}
}
本章完结,待续!
本文说明:该文章属于原创,如需转载,请标明文章转载来源