Java单例模式7种写法,你是不是有用错过?

公众号:码农乐园 等级 844 0 0

单例大家都很清楚的知道作用,也不多说,主要是在不同的情况下注意事项;

单例模式多种写法 1、饿汉式[可用] //饿汉式

  private final  static  Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
    return INSTANCE;
}

优点:这种单例写法比较简单,就是在类加载的时候就完成实例化。静态避免了线程同步问题。

缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。

2、饿汉式[可用]

  static  Singleton singleton;
static {
     singleton = new Singleton();
}
public static  Singleton  getInstance1(){
    return singleton;
}

这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。

3、懒汉式[不可用]

  static  Singleton singleton;
public static Singleton getInstance2() {
    if (singleton == null) {
        singleton = new Singleton();
    }
    return singleton;
}

如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式。

4、懒汉式[不推荐用]

//懒汉式线程安全

  static  Singleton singleton;
public static synchronized Singleton getInstance3(){
    if (singleton == null){
        singleton = new Singleton();
    }
    return singleton;
}

解决上面第三种实现方式的线程不安全问题,做个线程同步就可以了,getInstance()方法进行了线程同步。

缺点:效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低要改进。

5、懒汉式[不可用]

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

由于第四种实现方式同步效率太低,所以摒弃同步方法,改为同步产生实例化的的代码块。但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一致,假如一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。

6、双重检查[推荐用]

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

Double-Check概念对于多线程开发者来说不会陌生,如代码中所示,我们进行了两次if (singleton == null)检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。

优点:线程安全;延迟加载;效率较高。

7、静态内部类[推荐用]

  public static class SingletonInstance{
    private static final  Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance6(){
    return SingletonInstance.INSTANCE;
}

优点:这种写法避免了线程不安全,延迟加载,效率高。

优点 系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。

缺点 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new,可能会给其他开发人员造成困扰,特别是看不到源码的时候。

收藏
评论区

相关推荐

Java单例模式7种写法,你是不是有用错过?
单例大家都很清楚的知道作用,也不多说,主要是在不同的情况下注意事项; 单例模式多种写法 1、饿汉式可用 //饿汉式 language private final static Singleton INSTANCE new Singleton(); private Singleton(){} public static Singleton
创建型模式之单例设计模式
什么是单例设计模式? 顾名思义,只有一个实例。 单例模式它主要是确保一个类只有一个实例,并且可以提供一个全局的访问点。 废话少说,直接上干货了 单例模式之饿汉式 所谓饿汉式,顾名思义,“ 它很饿 ”。所以说,它一旦被加载进来,就会直接实例化一个对象。 例如: language class Singleton { private static fin
C#单例
单例模式: 步骤: 1.定义静态私有对象 2.构造函数私有化 3.定义一个静态的,返回值为该类型的方法,一般以Getinstance/getInit为方法名称 单例模式有懒汉和饿汉,最好使用饿汉 1.饿汉式---先实例化 public class Singleton { private stati
JAVA设计模式之单例设计模式
        单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。   在JAVA中实现单例,必须了解JAVA内存机制,JAVA中实例对象存在于堆内存中,若要实现单例,必须满足两个条件:   1.限制类实例化对象。即只能产生一个对象。
Java ASM 简单例子
###Test的代码比较简单 public class Test { /\*\* \* @param args \*/ public static void main(String\[\] args) { test01(); } static void test01() { System.out.println("Hello In Tes
Java单例模式
**什么是单例模式**   单例模式是在程序中,一个类保证只有一个实例,并提供统一的访问入口。 **为什么要用单例模式** * 节省内存 节省计算 * 如对象实例中的一样的,那就不用每次都创建一个对象 * 方便管理 * 因为单例提供一个统一的访问入口,不需要创建N多个对象,很多工具类都用了单例实现,如日志、字符串工具类 *
Java单例模式实现方式
懒汉式-非线程安全 --------- public class LazyNoSafe { private static LazyNoSafe instance; public static LazyNoSafe getInstance() { if (instance == null) {
Java多线程下单例
/* 多线程下的单例 */ //饿汉式 class Single { private static final Single s = new Single(); private Single(){} public static Single g
Java设计模式:Singleton(单例)模式
概念定义 ==== Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象。因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式。 单例模式主要是为了避免创建多个实例造成的资源浪费,以及多个实例多次调用容易导致结果出现不一致等问题。例如,一个系统只能有一个窗口管理器或文件系统,一个程
java中ajax的用法简单案例
1.index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="js/jquery-2.1.0.js">
java中单例模式的比较
单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好、用对单例模式,还真得费一番脑筋。本文对Java中常见的单例模式写法做了一个总结,如有错漏之处,恳请读者指正。 ### 饿汉法: 就是在第一次引用该类的时候就创建对象实例,而不管实际是否需要创建。 public class Singleton {            pr
java中饿汉与懒汉的故事(单例设计模式)
java中的单例设计模式 ------------ 关于设计模式,这其实是单独存在的东西,它不属于java,但是在java中使用较多,所以今天我就给大家介绍下单例设计模式中的饿汉和懒汉这俩朴素的打工人。 首先我先说明下单例设计模式是啥(如果不想了解,可以直接划下去看饿汉和懒汉):类的单例设计模式就是采用一定的方法保证在整个软件系统中,对某个类只能存在一
java枚举类单例示例
public class Singleton {     //私有化构造函数     private Singleton(){ }       //定义一个静态枚举类     static enum SingletonEnum{         //创建一个枚举对象,该对象先天为单例         INSTANCE;    
Scala 学习笔记(6)
一、单例对象 在Scala当中没有静态属性或方法,如果需要的话,可以通过object来实现。另外,如果你需要用到单例,也可以用object来实现。总结:object = static+singleton object ObjectTest {   var name = ""   var age = 0   def main(args : Ar
Struts2单例和多例
struts2中action是多例的,即一个session产生一个action如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的属性不一样,操作得出的结果不一样.举个例子:有一块布长度300cm,能做一件上衣(用掉100cm)和一件裤子(用掉200cm);甲和乙同时访问得到的长度都是300cm,甲想做上