当前位置: 首页 > news >正文

单例的几种写法

1.饿汉式

类加载时进行实例化

优点:简单

缺点:不管是否使用都会实例化,浪费内存

public class Singleton {
    //构造器私有化 防止外部实例
    private Singleton() {
    }

    private static final Singleton SINGLETON = new Singleton();

    public static Singleton getInstance(){
        return SINGLETON;
    }
}

2.懒汉式

用synchronized对方法加锁

优点:使用时才实例化,节省内存

缺点:方法上加锁,代价大

public class Singleton {
    //构造器私有化 防止外部实例
    private Singleton(){
    }

    private static  Singleton SINGLETON;

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

3.双重校验(懒汉式)

用synchronized对代码块中加锁。

volatile作用:

有序性:防止指令重排,不加可能会产生半初始化对象(加载了但没有执行构造函数)

可见性:保证内存一致性,只有主存一份数据。

优点:使用时才实例化,节省内存

缺点:加锁,代价大,虽然比方法加锁代价小,但是仍然需要加锁。另外比较复杂

public class Singleton {
    //构造器私有化 防止外部实例
    private Singleton(){
    }

    // volatile
    private static volatile Singleton SINGLETON;

    public static Singleton getInstance(){
        if (SINGLETON == null){
            synchronized(Singleton.class){
                SINGLETON = new Singleton();
            }
        }
        return SINGLETON;
    }
}

4.静态内部类(推荐写法)

在静态内部类中实例化对象

优点:使用时才实例化,节省内存,而且不用加锁也能保证线程安全

缺点:复杂

public class Singleton {

    //构造器私有化 防止外部实例
    private Singleton(){
    }

    private static Singleton singleton;

    public static Singleton getInstance(){
        return SingletonHander.singleton;
    }

    private static class SingletonHander{
        private static final Singleton singleton = new Singleton();
    }
}

5.枚举(推荐写法)

Effective Java作者Josh Bloch 提倡的方式。

简单,现成安全,所用单例实现中唯一一种不会被破坏的单例实现模式。

public enum Singleton {
    INSTANCE;
}

相关文章:

  • ARP攻击和欺骗原理讲解
  • 如何安装双系统与多系统(带你快速了解)
  • Java语法核心——面向对象编程
  • 指针与数组
  • qsort函数用法 + 模拟实现qsort函数
  • 1. Spring 基础入门
  • 第十三届蓝桥杯省赛 Java A 组 I 题、Python A 组 I 题、Python B 组 J 题——最优清零方案(AC)
  • python图像处理(图像缩放)
  • 2023需要重点关注的四大AI方向
  • 【BTC】数据结构
  • C语言深度解剖-关键字(2)
  • 【二叉搜索树】BST相关题目
  • 济人药业更新招股书:计划在A股上市,中成药业务收入持续下滑
  • 哪里可以找到电子版的大学课本?
  • 数据结构 第三章 栈和队列(队列)
  • 自制DAPLink 基于ARM官方源码以及STM32F103C8T6
  • 极限存在准则 两个重要极限——“高等数学”
  • 【二叉树】java实现代码,详解二叉树,带大家更深刻的掌握二叉树递归思想
  • VMWare 移动Linux CentOS 7虚拟机后连不上网怎么办
  • Opencv调参神器——trackBar控件