饿汉式单例:(立即加载)

publicclassSingleton1{

// 指向自己实例的私有静态引用,主动创建

privatestaticSingleton1 singleton1 = newSingleton1();

// 私有的构造方法

privateSingleton1(){}

// 以自己实例为返回值的静态的公有方法,静态工厂方法

publicstaticSingleton1 getSingleton1(){

    returnsingleton1;

   }

}

懒汉式单例:(延迟加载)

// 懒汉式单例

publicclassSingleton2{

// 指向自己实例的私有静态引用

  privatestaticSingleton2 singleton2;

  // 私有的构造方法

  privateSingleton2(){}

  // 以自己实例为返回值的静态的公有方法,静态工厂方法

  publicstaticSingleton2 getSingleton2(){

  // 被动创建,在真正需要使用时才去创建

    if(singleton2 == null) {

  singleton2 = newSingleton2();

  }

    returnsingleton2;

  }

}

多线程下线程安全的懒汉式单例(饿汉式本身是线程安全的):

1)、同步延迟加载 — synchronized方法

// 线程安全的懒汉式单例

publicclassSingleton2{

  privatestaticSingleton2 singleton2;

     privateSingleton2(){}

  // 使用 synchronized 修饰,临界资源的同步互斥访问

    publicstaticsynchronizedSingleton2 getSingleton2(){

       if(singleton2 == null) {

        singleton2 = newSingleton2();

     }

      returnsingleton2;

     }

  }

2)、同步延迟加载 — synchronized块

// 线程安全的懒汉式单例

publicclassSingleton2{

  privatestaticSingleton2 singleton2;

     privateSingleton2(){}

       publicstaticSingleton2 getSingleton2(){

         synchronized(Singleton2.class){

      // 使用 synchronized 块,临界资源的同步互斥访问

      if(singleton2 == null) {

      singleton2 = newSingleton2();

         }

      }

        returnsingleton2;

      }

    }

3)、同步延迟加载 — 使用内部类实现延迟加载

// 线程安全的懒汉式单例

publicclassSingleton5{

   // 私有内部类,按需加载,用时加载,也就是延迟加载

    privatestaticclassHolder{

       privatestaticSingleton5 singleton5 = newSingleton5();

   }

    privateSingleton5() {

    }

      publicstaticSingleton5 getSingleton5() {

     returnHolder.singleton5;

     }

    }

4)双重检测

// 线程安全的懒汉式单例

publicclassSingleton3{

//使用volatile关键字防止重排序,因为 new Instance()是一个非原子操作,可能创建一个不完整的实例

     privatestaticvolatileSingleton3 singleton3;

       privateSingleton3() {

    }

     publicstaticSingleton3 getSingleton3() {

     // Double-Check idiom

      if(singleton3 == null) {

         synchronized(Singleton3.class) { // 1

      // 只需在第一次创建实例时才同步

       if(singleton3 == null) { // 2

       singleton3 = newSingleton3(); // 3

         }

       }

   }

     returnsingleton3;

     }

  }

5)ThreadLocal

publicclassSingleton{

// ThreadLocal 线程局部变量,将单例instance线程私有化

privatestaticThreadLocal<Singleton> threadlocal = new ThreadLocal<Singleton>();

  privatestaticSingleton instance;

    privateSingleton() {

}

 publicstaticSingleton getInstance() {

// 第一次检查:若线程第一次访问,则进入if语句块;否则,若线程已经访问过,则直接返回ThreadLocal中的值

     if(threadlocal.get() == null) {

       synchronized(Singleton.class) {

         if(instance == null) {

      // 第二次检查:该单例是否被创建

         instance = newSingleton();

    }

   }

        threadlocal.set(instance); // 将单例放入ThreadLocal中

    }

      returnthreadlocal.get();

  }

}

优质内容筛选与推荐>>
1、c 读取文本
2、一个编译器的实现0
3、有关asp.net性能的web.config设置
4、mac版navicat
5、存储过程分页


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号