开发工具与关键技术:MyEclipse 10,java
撰写时间:2019年7月15日
单例模式属于23种设置模式之一,属于创建型模式类型;Java中单列模式的定义为:一个类有且仅有一个实例,并且自行实例化向整个系统提供;对于学习Java的人来说单例模式会很熟悉,它适用于一下场景:
- 需要生成唯一序列的环境;
- 需要频繁实例化然后销毁对象;
- 创建对象时耗时过多或者耗资原过多,但又经常用到的对象;
- 方便资源相互通信的环境;
Java实现单列模式有五种实现方式
- 饿汉式:
特点:线程安全,调用率高,但是不能延时加载;
示例:
package com.gx.singleton;
/**
* 饿汉式单例
* (线程安全,调用效率高,但是不能延时加载)
*/
public class SingletonOne {
//实例化这个类
private static final SingletonOne INSTANCE=new SingletonOne();
//1、隐藏构造器
private SingletonOne(){
}
//创建静态工厂方法 ,让外部可以获取实例
public static SingletonOne getInstance(){
return INSTANCE;
}
}
- 懒汉式:
特点:线程安全,调用效率不高,但是能延时加载;
示例:
package com.gx.singleton;
/**
* 懒汉式单例
* 线程安全,调用效率不高,但是能延时加载
*/
public class SingletonTwo {
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
private static SingletonTwo instance;
// 私有化构造器
private SingletonTwo() {
}
//方法同步,调用效率低
// 创建静态工厂方法 ,让外部可以获取实例
public static synchronized SingletonTwo getInstance() {
if (instance == null) {
instance = new SingletonTwo();
}
return instance;
}
}
- Double CheckLock实现单例:
即双重锁判断机制,是在懒汉式基础上发展而来;
package com.gx.singleton;
/**
* Double CheckLock实现单例
* Double CheckLock也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用)
*/
public class SingletonThree {
private volatile static SingletonThree instance;
//私有化构造器
private SingletonThree() {
}
//静态工厂方法,双重锁判断机制
public static SingletonThree newInstance() {
if (instance == null) {
synchronized (SingletonThree.class) {
if (instance == null) {
instance = new SingletonThree();
}
}
}
return instance;
}
}
- 静态内部类模式:
特点:线程安全,调用效率高,可以延时加载;
package com.gx.singleton;
/**
* 静态内部类实现模式
* 线程安全,调用效率高,可以延时加载
*/
public class SingletonFour {
// 静态内部类
private static class SingletonClassInstance {
private static final SingletonFour instance = new SingletonFour();
}
// 私有化构造器
private SingletonFour() {
}
//静态工厂方法
public static SingletonFour getInstance() {
return SingletonClassInstance.instance;
}
}
5.枚举类:
特点:线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化的调用;
package com.gx.singleton;
public class SingletonFive {
//私有化构造器
private SingletonFive(){}
//使用枚举
private static enum Singleton{
INSTANCE;
private SingletonFive singleton;
//JVM会保证此方法绝对只调用一次
private Singleton(){
singleton = new SingletonFive();
}
public SingletonFive getInstance(){
return singleton;
}
}
//静态工厂方法
public static SingletonFive getInstance(){
return Singleton.INSTANCE.getInstance();
}
}
在单例对象占用资源少,不需要延时加载时:枚举类好于饿汉式;单例对象占用资源多,需要延时加载时:静态内部类好于懒汉式。