Singleton-六种单例模式特点
package com.xiawei.singleton;
/**
* 第一种
* 饿汉模式
* 核心思想是:类加载时初始化单利
* 优缺点:线程安全。浪费资源
* 适用范围:适用多线程
*/
public class SingletonA {
private static final SingletonA singletonA = new SingletonA();
public SingletonA() {}
public static SingletonA getSingletonA(){
return singletonA;
}
}
===================================================================
package com.xiawei.singleton;
/**
* 第二种
* 饱汉模式
* 核心是:懒加载
* 优缺点:线程不安全,节省资源
* 适用范围:单线程
*/
public class SingletonB {
private static SingletonB singletonB = null;
public SingletonB() {}
public static SingletonB getSingletonB(){
if(singletonB == null){
singletonB = new SingletonB();
}
return singletonB;
}
}
==================================================================
package com.xiawei.singleton;
/**
* 第三种
* 饱汉模式_变形1
* 核心思想:懒加载
* 优缺点:线程安全,并发性差
*/
public class SingletonC {
private static SingletonC singletonC = null;
public SingletonC() {}
public static synchronized SingletonC getSingletonC(){
if(singletonC == null){
singletonC = new SingletonC();
}
return singletonC;
}
}
==========================================================================
package com.xiawei.singleton;
/**
* 第四种
* 饱汉模式_变形2
* 核心是:懒加载
* 优缺点:线程安全,控制了并发性
*/
public class SingletonD {
private static SingletonD singletonD = null;
public SingletonD() {}
public static SingletonD getSingletonD(){
if(singletonD == null){
synchronized(SingletonD.class){
if(singletonD == null){
singletonD = new SingletonD();
}
}
}
return singletonD;
}
}
==============================================================================
package com.xiawei.singleton;
/**
* 第五种
* 饱汉模式_变形3
* 核心思想是:懒加载
* 优缺点:线程安全,节省资源
* 适用范围:适用于多线程敏捷环境
*
*/
public class SingletonE {
private static volatile SingletonE singletonE = null;
public SingletonE() {}
public static SingletonE getSingletonE(){
if(singletonE == null){
synchronized(SingletonE.class){
if(singletonE == null){
singletonE = new SingletonE();
}
}
}
return singletonE;
}
}
/**
* 这里补充一下关于volatile关键字的理解:
*上面用到了一个关键字volatile ['vɑl?tl],在java语言中volatile可以保证内存可见性,禁止指令重排等.
* 这里提到可见性,那么什么是可见性呢?所谓可见性是指线程之间的可见性,一个线程修改的状态对另一个
* 线程是可见的也就是一个线程修改的结果,另一个线程马上就能看到。
* 看一下它的实现原理:
* 当对一般普通变量进行读写操作时,每个线程都是从其主内存copy变量到本地CPU缓存中,如果我们
* 的计算机有多个CPU,每个线程可能在不同的CPU上被处理,也就是每个线程可以copy到不同的CPU
* cache(高速缓冲存储器)中。volatile修饰的变量不会被缓存在寄存器或其他处理器不可兼得地方,这样保证了每次
* 读写变量都是从主内存中读,跳过CPU cache这一步当一个线程改变了这个变量的值新值对于其他线程是立即可知的
*
*
*/
==============================================================================
package com.xiawei.singleton;
/**
* Holder模式
* 核心思想:懒加载+静态变量
* 优缺点:线程安全,节省资源,可读性好
* 适用范围:适用于多线程
*/
public class SingletonF {
static class SingletonHolder{
private static final SingletonF singletonF = new SingletonF();
public SingletonHolder() {}
}
public SingletonF() {}
public synchronized static SingletonF getSingletonF(){
return SingletonHolder.singletonF;
}
}