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

单例(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
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值