设计模式写法之单例模式

饿汉式:

package design_pattern.singleInstance;

/** 
 * 饿汉式
 * 特点: 线程安全、调用效率高、非延时加载(增加系统启动时的资源开销)
 *       适用于对象调用频繁的场景
 * @author 57198
 *
 */
public class Singleton_Hunger {

	// 类初始化时立即加载(加载类时天然线程安全)
	private static Singleton_Hunger singleInstance = new Singleton_Hunger();
	
	// 构造方法私有,除了在当前类中其他位置调用不到,就无法创建对象实例。
	private Singleton_Hunger() {}
	
	// 不需要加synchronized,线程安全(类初始化时即创建对象)
	public static Singleton_Hunger getIntance() {
		return singleInstance;
	}
}

懒汉式:

package design_pattern.singleInstance;

/** 
 * 懒汉式
 * 特点: 线程安全、调用效率低、延时加载(降低系统启动时的资源开销)
 *       适用于对象创建消耗资源多的场景
 * @author 57198
 *
 */
public class Singleton_Lazy {

	// 类初始化时不创建对象
	private static Singleton_Lazy singleInstance;
	
	// 构造方法私有,除了在当前类中其他位置调用不到,就无法创建对象实例。
	private Singleton_Lazy() {}
	
	// 需要加synchronized,保证线程安全
	public static synchronized Singleton_Lazy getInstance() {
		if (singleInstance == null) {
			singleInstance = new Singleton_Lazy();
		}
		return singleInstance;
	}
	
}

静态内部类实现:

package design_pattern.singleInstance;

/**
 * 静态内部类实现
 * 特点: 线程安全、调用效率高、延时加载(降低系统启动时的资源开销)
 * @author 57198
 *
 */
public class Singleton_Static {

	// 静态内部类,类加载时线程安全
	private static class SingletonInstance{
		private static final Singleton_Static singleIntance = new Singleton_Static();
	}
	
	private Singleton_Static() {}
	
	/*
	 * 方法不加同步synchronized,调用效率高
	 * 当需要对象时调用方法,通过静态内部类去创建对象。
	 */
	public static Singleton_Static getInstance() {
		return SingletonInstance.singleIntance;
	}
	
}

枚举类实现:

package design_pattern.singleInstance;

/**
 * 实现简单、线程安全、非延迟加载
 * 注意:枚举本身就是单例模式(可以避免通过反射和反序列化来创建对象)
 *      不考虑延迟加载时推荐使用枚举的方式
 * @author 57198
 *
 */
public enum Singleton_Enum {
	
	// 这个枚举对象本身就是单例
	INSTANCE;
	
	// 下边可以加一些逻辑处理等
}

是否为单例测试:

在这里插入图片描述

效率测试

package design_pattern.singleInstance;

import java.util.concurrent.CountDownLatch;
/**
 * 20个线程
 * 每个线程线程获取一亿次对象
 * @author 57198
 *
 */
public class Efficiency_Test {
	
	
	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		// 定义线程数量为20
		int threadNum = 20;
		// 创建线程测试辅助类对象		
		final CountDownLatch countDownLatch = new CountDownLatch(threadNum);
		
		for(int i=0; i<threadNum; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					// TODO Auto-generated method stub
					for(int i=0;i<100000000;i++) {
						Object object = Singleton_Hunger.getIntance();
					}
					// 线程计数器减1
					countDownLatch.countDown();
				}
				
			}).start();
		}
		// 等待线程执行完后继续执行下边的代码
		long endTime = System.currentTimeMillis();
		System.out.println("耗时:" + (endTime - startTime));
	}
	
	
}

结果展示(与机子性能有关):

饿汉式:
在这里插入图片描述
懒汉式:
在这里插入图片描述
静态内部类:
在这里插入图片描述
枚举:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值