java单例模式的实现方式以及差异

恶汉单例模式:
/**

  • 恶汉单例模式,用空间换时间的思想进行对象的初始化,在多线程的情况下,故不存在线程安全问题。

    • @author Administrator
    • */
      public class WickedManSingleTon {

    private static WickedManSingleTon instance=new WickedManSingleTon();

    private WickedManSingleTon() {

    }

    public static WickedManSingleTon getIntance() {
    return instance;
    }

}

懒汉模式:

/**

  • 懒汉单例模式,用时间换空间的概念,实例化单例对象,在多线程的情况下,存在线程安全的问题。

    • @author Administrator
    • */
      public class LasyManSingleTon {

    private static LasyManSingleTon instance=null;

    private LasyManSingleTon() {

    }

    public static LasyManSingleTon getInstance() {
    if(instance==null) {
    instance=new LasyManSingleTon();
    }
    return instance;
    }

}

/**

  • 双检索实现单例模式
  • @author Administrator DCL模式的优点就是,只有在对象需要被使用时才创建,第一次判断 INSTANCE ==
  • null为了避免非必要加锁,当第一次加载时才对实例进行加锁再实例化。这样既可以节约内存空间,又可以保证线程安全。但是,由于jvm存在乱序执行功能,DCL也会出现线程不安全的情况。具体分析如下:
  • INSTANCE = new DCLInstance();
  • 这个步骤,其实在jvm里面的执行分为三步: ??
  • 1.在堆内存开辟内存空间。 ?
  • 2.在堆内存中实例化SingleTon里面的各个参数。 ?
  • 3.把对象指向堆内存空间。
  • 由于jvm存在乱序执行功能,所以可能在2还没执行时就先执行了3,如果此时再被切换到线程B上,由于执行了3,INSTANCE
  • 已经非空了,会被直接拿出来用,这样的话,就会出现异常。这个就是著名的DCL失效问题。
    */
    public class DCLInstance {
    // 手写双检索
    private static DCLInstance instance = null;//优化采用volatile

    private DCLInstance() {

    }

    public static DCLInstance getInstance() {

    if (instance == null) {
        // 同步操作
        synchronized (DCLInstance.class) {
            if (instance == null) {
                // 多线程环境下可能会出现问题的地方
                instance = new DCLInstance();
            }
        }
    }
    return instance;

    }

}

/**

  • @author Administrator
  • 内部类的形式实现单例模式:
  • 静态内部类的优点是:外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。
  • 即当SingleTon第一次被加载时,并不需要去加载SingleTonHoler,只有当getInstance()方法第一次被调用时,
  • 才会去初始化INSTANCE,第一次调用getInstance()方法会导致虚拟机加载SingleTonHoler类,
  • 这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。
  • */
    public class InerClassMakeIntance {

    private static InerClassMakeIntance instance =null;

    private InerClassMakeIntance() {

    }

    public static InerClassMakeIntance getInstance() {
    return InerInstance.t1;
    }

    private static class InerInstance {
    private static InerClassMakeIntance t1 = new InerClassMakeIntance();
    }
    }

原文地址:https://blog.51cto.com/13217372/2437525

时间: 2024-10-31 14:13:32

java单例模式的实现方式以及差异的相关文章

Java单例模式 多种实现方式

一:通过静态私有成员实现单例模式 (1):私有化构造函数 (2):new静态实例属性对象,加锁. 单例类: package SinglePag; /* * 构造函数私有化,结合锁+静态的概念 实现单例模式 */ public class SingleDemo { //防止类的实例化 private SingleDemo(){ } //静态 实例 属性 private static SingleDemo singleD; //获取对象实例 (单例的方式 ),锁住当前类(加锁) public syn

资料-Java基础:类加载方式及差异

虚拟机加载类的途径1.由 new 关键字创建一个类的实例在由运行时刻用 new 方法载入如:Dog dog = new Dog():2.调用 Class.forName() 方法通过反射加载类型,并创建对象实例如:Class clazz = Class.forName(“Dog”):Object dog =clazz.newInstance():3.调用某个 ClassLoader 实例的 loadClass() 方法通过该 ClassLoader 实例的 loadClass() 方法载入.应用

Java单例模式的3种实现方法及特点

最近看到一篇关于Java中instance的文章(http://www.zhihu.com/question/29971746),引发对单例模式的一些思考,并从网上搜集了一些关于Java单例模式的文章,总结如下: 首先,贴出三种单例设计的简单代码: 1.延迟加载——不考虑效率问题的延迟加载 public class SingleTon{ private static SingleTon instance = null; public static synchronized SingleTon g

Java 单例模式探讨

以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. 总结一下我所知道的单例模式实现方式: 1.预先加载法 Java代码 class S1 { private S1() { System.out.println("ok1"); } private static S1 instance = new S1(); public static S1

设计模式—单例模式2·实现方式

前言 前面介绍了单例模式是什么东东,并且在最后让Student类实现了单例模式.但是,单例模式实现的方式不仅仅只有单例模式1中演示的那一种,其实方式有很多.这里介绍常用的几种单例模式的实现方式: 1.饿汉式 2.懒汉式 3.懒汉式的进阶方式--双重验证 上面三个名词听不懂不要紧,先有个印象就行,下面听我慢慢扯-- 一.饿汉式 在单例模式1中介绍的那种实现方式就被称作为饿汉式,当Student类被加载到内存中的时候,我们创建的这个单例(Student类的对象)就已经被创建完成了.下面是这种实现方式

深入Java单例模式(转)

深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下. 所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 1. 最简单的实现 首先,能够想到的最简单的实现是,把类

java单例模式的心得

由于设计模式对于java高级开发人员来说是非常重要的,网上也有很多关于设计模式的文章,博客等.所以,首先我对相对简单的单例模式做一个简单的总结. 一.实现方式 单例模式的实现方式有3种,分别是饿汉式,懒汉式,IoDH这3种,下面分别介绍下每种的实现原理和优缺点. a)饿汉式 实现原理:类具有一个静态成员变量,且初始化的值是一个实例化的对象本身. 优点:即使多线程并发访问也可确保只有一个唯一的对象:在获取对象时候,可以快速响应. 缺点:类加载时就创建了对象,导致资源利用率不高. b)懒汉式 实现原

java单例模式案例

</pre>单例模式是一种常见的设计模式,一般有三种方式,单例模式具有如下特点:<p></p><p><span style="white-space:pre">1.在类的属性中,自己初始化一个静态的私有的类实例<span style="white-space:pre"></span>2.将自己的构造方法写成private的方式,拒绝其他类或者操作再次使用构造函数将单例类再次实例化&l

可能是最全的Java单例模式讨论

单例模式 最简单但是也挺困难的. 要保证在一个JVM中只能存在一个实例,要考虑到如下的情况: Java能够使用那些方式构建对象 Java在创建对象时多线程并发情况下是否仍然只能创建一个实例 Java创建对象的方法: new 最常用的,直接使用构造器创建. 每new一次都会产生新的实例.所以单例中应该只new一次,当再想用对象时都返回该对象的值 Class.newInstance() 该方法会调用public 的无参构造器. 为了防止这个方式创建,只要把构造器设置为private的就可以了.这是如