饿汉式:
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));
}
}
结果展示(与机子性能有关):
饿汉式:
懒汉式:
静态内部类:
枚举: