单例模式的学习

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;

}


以上是关于单例模式的学习的主要内容,如果未能解决你的问题,请参考以下文章

设计模式_单例模式

java设计模式学习 ----- 单例模式(Singleton)

Java设计模式学习01——单例模式(转)

设计模式学习——单例模式

设计模式学习笔记------单例模式

设计模式学习系列——单例模式