您的位置:首页 > 编程语言 > Java开发

JAVA设计模式-单例模式(Singleton)的五种实现方式

2017-10-10 14:42 726 查看

单例(Singleton)模式 也叫单态模式

我在另一篇文章中已经介绍过了过关于单例模式的简单描述和优缺点,感兴趣的朋友可以点击下面的连接,在这里我就不在赘述。




单例模式(Singleton)应用场景和优缺点



本篇文章主要介绍单例模式常见的5种实现方式,分别是:懒汉式、饿汉式、双重检测锁式、静态内部类式和枚举单例。下面我将为大家逐个介绍他们的特点和实现方式。

饿汉式(线程安全、调用效率高、不能延时加载)

package com.ph.gof23.singleton;
/**
* 测试饿汉式单例模式
* 特点:线程安全、调用效率高、不能延时加载
* 缺点:如果当该类加载很费时间且从未被调用时会造成资源的浪费
* @author PangHao
* @param instance 类初始化时立即加载的对象
*
*/
public class SingletonDemo01 {

//static变量会在类加载时初始化,此时不会出现多个线程访问该对象的问题,虚拟机只加载一次该类(天然线程安全)
public static /*final*/ SingletonDemo01 instance=new SingletonDemo01(); //类初始化时立即加载该对象

//方法没有同步调用效率高
public static SingletonDemo01 getInstance(){
return instance;
}

//私有构造器
private SingletonDemo01() {
// TODO Auto-generated constructor stub
}

}


懒汉式(线程安全、调用效率不高、可以延时加载)

package com.ph.gof23.singleton;
/**
* 测试懒汉式单例模式
* 特点:线程安全、调用效率不高、可以延时加载
* 缺点:如果该类加载很费时间当初次调用时加载速度慢,且由于访问方法加锁,所以当多个线程访问时需要等待
* @author PangHao
* @param instance 单例对象
*
*/
public class SingletonDemo2 {

public static  SingletonDemo2 instance; //声明但不创建

//加锁保证线程安全(调用效率不高)
public static synchronized SingletonDemo2 getInstance(){
if(instance==null){
instance=new SingletonDemo2();//在用的时候创建

}
return instance;
}

//私有构造器
private SingletonDemo2() {
// TODO Auto-generated constructor stub
}

}


*静态内部类式(线程安全、调用效率高、可以延时加载)

package com.ph.gof23.singleton;
/**
* 测试静态内部类式单例模式
* 特点:线程安全、调用效率高、可以延时加载
* 优点:综合了懒汉饿汉的优点
* @author PangHao
* @param instance 单例对象
*
*/
public class SingletonDemo4 {

//静态内部类(类加载时静态内部类并不会立即初始化实现延时加载)
private static class SingletonClassInstance{
//线程安全
private static final SingletonDemo4 instance=new SingletonDemo4();
}

public static  SingletonDemo4 getInstance(){

return SingletonClassInstance.instance;
}

//私有构造器
private SingletonDemo4() {
// TODO Auto-generated constructor stub
}

}


枚举单例式(线程安全、调用效率高、不能延时加载)

package com.ph.gof23.singleton;
/**
* 测试枚举式单例模式
* 特点:实现简单,枚举本身单例,避免反射、反序列化漏洞
* 缺点:不能延时加载
* @author PangHao
* @param INSTANCE 单例对象
* 该类为枚举类
*/
public enum SingletonDemo5 {

//创建一个枚举元素,代表一个单例实例
INSTANCE;

//功能方法
public void SingletonOperation(){
//operation
}

}


双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)

package com.ph.gof23.singleton;
/**
* 测试双重检测锁式单例模式
* 特点:不必每次获取对象时都进行同步
* 缺点:由于JVM底层内部模型原因,偶尔会出问题,不建议使用
* @author PangHao
* @param instance 单例对象
*
*/
public class SingletonDemo3 {

public static  SingletonDemo3 instance=null;

public static  SingletonDemo3 getInstance(){
if(instance==null){
SingletonDemo3 sc;
synchronized (SingletonDemo3.class) {
sc=instance;
if(sc==null){
synchronized (SingletonDemo3.class) {
if(sc==null){
sc=new SingletonDemo3();
}
}
instance=sc;
}
}
}
return instance;
}

//私有构造器
private SingletonDemo3() {
// TODO Auto-generated constructor stub
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息