单例模式的学习
Posted 我的转行学习之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式的学习相关的知识,希望对你有一定的参考价值。
核心作用为:
保证线程只有一个是咧,并且提供一个访问该实例的全局访问点。
单例模式的优点是:
减少了系统的性能开销。
常见的五种单例模式的实现方式为:
主要:
饿汉式:(线程安全,调用效率高,但是不能延时加载。)
懒汉式:(线程安全,调用效率不高,但是可以延时加载。)
其他:
双重检测锁式:(由于JVM底层内部模型原因,偶尔会出现问题,了解即可不建议使用。)
静态内部类式:(线程安全,调用效率高,但是可以延时加载)
枚举单例:(线程安全,调用效率高,不能延时加载)
饿汉式:
package com.lxy.singleton;
/**
* 测试饿汉式单例模式
* @author 茉莉
*
*/
public class SingletonDemo1 {
//类初始化时,立即加载(没有延时加载的优势)这个对象 由于加载类是,天然的线程是安全的
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1() {
}//私有构造器
//方法没有同步,调用效率高
public static SingletonDemo1 getInstance() {
return instance;
}
}
懒汉式:
package com.lxy.singleton;
/**
* 测试懒汉式单例模式
* @author 茉莉
*
*/
public class SingletonDemo2 {
//类初始化时,不初始化(延时加载,真正用的时候再构建)这个对象 由于加载类是,天然的线程是安全的
private static SingletonDemo2 instance;
private SingletonDemo2() {
}//私有构造器
//方法同步,调用效率低
public static synchronized SingletonDemo2 getInstance() {
if(instance==null) {
instance = new SingletonDemo2();
}
return instance;
}
}
静态内部类式:
package com.lxy.singleton;
/**
* 静态内部类实现单例模式
* 这种模式线程安全,调用效率高,并且实现了延时加载
* @author 茉莉
*
*/
public class SingletonDemo3 {
private static class SingletonClassInstance{
private static final SingletonDemo3 instance = new SingletonDemo3();
}
private SingletonDemo3() {
}
//方法没有同步
public static SingletonDemo3 getInstance() {
return SingletonClassInstance.instance;
}
}
枚举式:
package com.lxy.singleton;
/**
* 测试枚举实现单例模式(没有延时加载)
* @author 茉莉
*
*/
public enum SingletonDemo4 {
//这个枚举元素本身就是单例模式
INSTANCE;
//添加自己需要的操作!
public void singletonOperation() {
}
}
如何选择:
单例对象,占用资源少,不需要延时加载时用 枚举式好于饿汉式
单例对象 ,占用资源多需要延时加载时用静态内部类式好于懒汉式
防止反序列化破坏单例时可加:
//反序列化时,如果定义了readResolve()则直接返回此方法的指定定向。而不需要单独再创建对象
private Object readResolve()throws ObjectStreamException {
return instance;
}
以上是关于单例模式的学习的主要内容,如果未能解决你的问题,请参考以下文章