前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java单例模式-懒汉式、恶汉式、静态内部类、枚举以及线程安全问题

Java单例模式-懒汉式、恶汉式、静态内部类、枚举以及线程安全问题

作者头像
孙晨c
发布2020-03-27 09:55:08
1K0
发布2020-03-27 09:55:08
举报
文章被收录于专栏:无题~无题~

Java的单例模式常见的分为懒汉式、饿汉式、静态内部类、枚举

通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数额控制并节约系统资源。

饿汉式:

代码语言:javascript
复制
public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance; 
    }

}

特点:

  在这个类初始化时就创建了对象, 每次调用都返回同一个对象。

  饿汉模式是线程安全的,可以直接用于多线程而不会出现问题。但是不需要这个对象时,对象就会占用内存空间。

懒汉式:

代码语言:javascript
复制
public class Singleton {

    private static Singleton instance = null;

    private Singleton() {
    }

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

}

特点: 

  在调用获取对象的方法时判断, 如果没有这个对象才会创建。

  这样在多线程的环境下会存在线程安全问题,JVM出于对效率的考虑,是在happens-before原则内(out-of-order)乱序执行。

懒汉式线程安全问题解决方法:DCL模式(double-check-locking)

代码语言:javascript
复制
class Singleton {
    public static Bank instance = null;

    public Singleton(){ }


    //效率更高的、线程安全的懒汉模式
    public static Singleton getInstance(){

    //外面加一层判断,若对象不为Null,就让后面的线程直接返回对象,不用再排队挤进去
        if(instance == null){
            synchronized (Singleton.class){//使用synchronized关键字,保证只有一次只有一个线程进入,创建实例对象
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}

静态内部类:

代码语言:javascript
复制
public class SingleTon{
  private SingleTon(){}
 
  private static class SingleTonHoler{
     private static SingleTon INSTANCE = new SingleTon();
 }
 
  public static SingleTon getInstance(){
    return SingleTonHoler.INSTANCE;
  }
}

特定:

  这是官方推荐的。外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。

枚举:

代码语言:javascript
复制
public enum SingleTon{
  INSTANCE;
        public void method(){
        //TODO
     }
}

特点:

枚举在java中与普通类一样,都能拥有字段与方法,而且枚举实例创建是线程安全的,在任何情况下,它都是一个单例。我们可直接以下面这种方式调用。

代码语言:javascript
复制
SingleTon.INSTANCE
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java的单例模式常见的分为懒汉式、饿汉式、静态内部类、枚举
  • 饿汉式:
  • 懒汉式:
  • 懒汉式线程安全问题解决方法:DCL模式(double-check-locking)
  • 静态内部类:
  • 枚举:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档