JAVA设计模式---单例模式你知道吗

目录
  • 单例模式的介绍
  • 单例模式实现的八种方式
    • 饿汉式
      • 静态常量
      • 静态代码块
    • 懒汉式
      • 线程不安全的写法
      • 线程安全,同步锁—效率低,不推荐
      • 线程安全,同步代码块—无法解决线程安全问题,不推荐
    • 双重检查—解决线程安全和懒加载问题–推荐使用
    • 静态内部类—可以实现懒加载,线程安全,推荐使用
    • 枚举
  • 单例模式注意事项
  • 总结

单例模式的介绍

单例模式实现的八种方式

饿汉式

静态常量

步骤:

1.构造器私有化(防止new)

2.类的内部创建对象

3.向外暴露一个静态的公共方法—getInstance

//饿汉式静态常量
class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private final static  Singleton  instance=new Singleton();
    //提供一个公有的静态方法,返回一个实例对象
    public static Singleton getInstance()
    {
     return instance;
    }
}
public class Main
{
    public static void main(String[] args)
    {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

静态代码块

//饿汉式静态常量
class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private static  Singleton  instance;
    //在静态代码块中,创建单例对象
    static
    {
     instance=new Singleton();
    }
    //提供一个公有的静态方法,返回一个实例对象
    public static Singleton getInstance()
    {
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

静态代码块的优缺点

懒汉式

线程不安全的写法

class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private static  Singleton  instance;
    //提供一个公有的静态方法
    //当使用该方法时,才去创建实例对象
    //即懒汉式
    public static Singleton getInstance()
    {
        if(instance==null)
        {
            instance=new Singleton();
        }
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

优缺点

线程安全,同步锁—效率低,不推荐

class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private static  Singleton  instance;
    //提供一个公有的静态方法
    //当使用该方法时,才去创建实例对象
    //即懒汉式
    //给当前静态方法加上一个同步锁,这样所有的对象就是一把锁
    //多个对象同时调用此方法,会按顺序依次调用
    public static synchronized Singleton getInstance()
    {
        if(instance==null)
        {
            instance=new Singleton();
        }
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

优缺点

线程安全,同步代码块—无法解决线程安全问题,不推荐

class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    private static  Singleton  instance;
    //提供一个公有的静态方法
    //当使用该方法时,才去创建实例对象
    //即懒汉式
    public static  Singleton getInstance()
    {
        if(instance==null)
        {
            //锁的是代码块
            //锁的对象是当前类的字节码文件对象,即当前类的所有势力对象拥有一把锁
            synchronized(Singleton.class)
            {
                instance=new Singleton();
            }
        }
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

优缺点

双重检查—解决线程安全和懒加载问题–推荐使用

class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
    //静态常量
    //volatile 保证变量在多线程下的可见性,即每个线程获取到当前变量的值是最新的值
    private static  volatile Singleton  instance;
    //提供一个公有的静态方法
    //当使用该方法时,才去创建实例对象
    public static  Singleton getInstance()
    {
        //加入双重检查问题,解决线程安全,同时解决懒加载问题
        if(instance==null)
        {
            //锁的是代码块
            //锁的对象是当前类的字节码文件对象,即当前类的所有势力对象拥有一把锁
            synchronized(Singleton.class)
            {
                if(instance==null)
                {
                    instance=new Singleton();
                }
            }
        }
     return instance;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

优缺点

静态内部类—可以实现懒加载,线程安全,推荐使用

静态内部类在调用时,才会加载

当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的

class Singleton
{
  //构造器私有化,外部不能new
    private Singleton(){}
//静态内部类
    private static class SingletonInstance{
        //静态属性
        private static final Singleton INSTANCE=new Singleton();
}
    public static  Singleton getInstance()
    {
        //该方法调用时,静态内部类加载,里面的静态属性才会赋值
        return SingletonInstance.INSTANCE;
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

优缺点

枚举

enum Singleton
{
    //枚举常量
    INSTANCE;
    //底层: public static final Singleton INSTANCE= new Singleton ();
    //方法
    public void getInstance()
    {
        System.out.println("得到实例");
    }
}
public class Main
{
    public static void main(String[] args) {
        Singleton s1=Singleton.INSTANCE;
        Singleton s2=Singleton.INSTANCE;
        s1.getInstance();
        s2.getInstance();
        System.out.println(s1.hashCode()==s2.hashCode());
    }
}

优缺点

单例模式注意事项

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • java 单例模式容易忽略的细节

    java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上网搜吧这里就不讲了! 这里会涉及到java中的jvm,如果你没有这方面的知识,我建议你先去补补,不然会有点迷糊! 首先说说类什么时候进行加载? java虚拟机没有进行强制性的约束,但是对于初始化却严格规定了有且只有4种情况必须先对类进行初始化. 我们要知道的是在类加载的过程中,加载.验证.准备是在初始化之前完成的,所以进行了初始化,加载.验证.准备自然就在之前完成了. 然后这四种情况是分别遇到 new . get

  • Java单例模式的8种写法(推荐)

    单例:Singleton,是指仅仅被实例化一次的类. 饿汉单例设计模式 一.饿汉设计模式 public class SingletonHungry { private final static SingletonHungry INSTANCE = new SingletonHungry(); private SingletonHungry() { } public static SingletonHungry getInstance() { return INSTANCE; } } 因为单例对象

  • java单例模式实现的方法

    1.最基本的单例模式 /** * @author LearnAndGet * @time 2018年11月13日 * 最基本的单例模式 */public class SingletonV1 { private static SingletonV1 instance = new SingletonV1();; //构造函数私有化 private SingletonV1() {} public static SingletonV1 getInstance() { return instance; }

  • Java单例模式的创建,破坏和防破坏详解

    目录 前言 单例模式 单例模式的几种实现方式 懒汉式,线程不安全 懒汉式,线程安全 饿汉式 双检锁/双重校验锁 登记式/静态内部类 枚举 破坏单例模式 未破坏的情况 破坏后的情况 单例模式的防破坏 总结 前言 大家所熟知的单例模式只能创建唯一一个实例,今天我们介绍几种常见的单例模式,同时说一说如何破坏单例模式,同时又怎么来防破坏. 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种

  • Java开发中为什么要使用单例模式详解

    一.什么是单例模式? 单例设计模式(Singleton Design Pattern)理解起来非常简单.一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式. 二.实战案例一:处理资源访问冲突 我们先来看第一个例子.在这个例子中,我们自定义实现了一个往文件中打印日志的 Logger 类.具体的代码实现如下所示: public class Logger { private FileWriter writer; public Logger() {

  • Java设计模式之单例模式简介

    一.饿汉式(静态常量) public class Face { private static final Face instance = new Face(); static Face getInstance() { return instance; } private Face() { } } 优点:这种写法比较简单,就是在类装载的时候就完成实例化.避免了线程同步问题. 缺点:在类装载的时候就完成实例化,没有懒加载的效果.如果从始至终从未使用过这个实例,则会造成内存的浪费. 二.饿汉式(静态代

  • JAVA破坏单例模式的方式以及避免方法

    单例模式,大家恐怕再熟悉不过了,其作用与实现方式有多种,这里就不啰嗦了.但是,咱们在使用这些方式实现单例模式时,程序中就真的会只有一个实例吗? 聪明的你看到这样的问话,一定猜到了答案是NO.这里笔者就不卖关子了,开门见山吧!实际上,在有些场景下,如果程序处理不当,会无情地破坏掉单例模式,导致程序中出现多个实例对象. 下面笔者介绍笔者已知的三种破坏单例模式的方式以及避免方法. 1.反射对单例模式的破坏 我们先通过一个例子,来直观感受一下 (1)案例 DCL实现的单例模式: public class

  • Java设计模式单例模式(Singleton)用法解析

    这篇文章主要介绍了Java设计模式单例模式(Singleton)用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 单例模式的应用场景: 单例模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例.并提供一个全局反访问点.单例模式是创建型模式.单例模式在生活中应用也很广泛,比如公司CEO只有一个,部门经理只有一个等.JAVA中ServletCOntext,ServetContextCOnfig等,还有spri

  • JAVA设计模式---单例模式你知道吗

    目录 单例模式的介绍 单例模式实现的八种方式 饿汉式 静态常量 静态代码块 懒汉式 线程不安全的写法 线程安全,同步锁-效率低,不推荐 线程安全,同步代码块-无法解决线程安全问题,不推荐 双重检查-解决线程安全和懒加载问题–推荐使用 静态内部类-可以实现懒加载,线程安全,推荐使用 枚举 单例模式注意事项 总结 单例模式的介绍 单例模式实现的八种方式 饿汉式 静态常量 步骤: 1.构造器私有化(防止new) 2.类的内部创建对象 3.向外暴露一个静态的公共方法-getInstance //饿汉式静

  • java设计模式-单例模式实现方法详解

    目录 饿汉式 静态变量 静态代码块 懒汉式 线程不安全 线程安全 双重检查 静态内部类 总结 a 饿汉式 所谓饿汉式,就是直接创建出类的实例化,然后用private私有化,对外只用静态方法暴露. 静态变量 步骤 构造器私有化 类的内部创建对象 向外暴露一个静态的公共方法 优点 缺点 写法简单,在类装载的时完成实例化,避免了线程同步问题 类装载时完成实例化,没有达到LazyLoading的效果,若该实例从未使用,则会造成内存浪费 class Singleton { //私有化构造器 private

  • java设计模式之单例模式的详解及优点

    java设计模式之单例模式 定义:如果一个类始终只能创建一个实例,那么这个类被称为单例类,这种设计模式被称为单例模式. Spring框架里面可以将所有生成的bean对象都设置为单例模式,只需要在配置Bean实例时指定scope="singleton"即可,或者不做配置默认即为单例模式. 我们可以创建一个小的Demo来演示单例模式的实现,只需要保证该类只能创建一个实例,我们可以用权限修饰符private修饰该类的构造器. 提供一个创建该类的接口,该接口只能用static修饰,类里面创建一

  • Java设计模式之单例模式实例分析

    本文实例讲述了Java设计模式之单例模式.分享给大家供大家参考,具体如下: 单例模式:(Singleton Pattern)是一个比较简单的模式,其定义如下: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例) 单例模式,很简单的一个模式.其实在android开发中,很多地方都会用到单例模式,比如某些工具类.Json数

  • Java设计模式之单例模式实例详解【懒汉式与饿汉式】

    本文实例讲述了Java设计模式之单例模式.分享给大家供大家参考,具体如下: 单例模式就是产生一个对象实例,供外外部访问. 它的应用场景就是在这个类在全局真资源需要统一访问,否则会造成混乱时,才有必要设计成单例. 懒汉式,就是在使用这个对象时,才去查看这个对象是否创建,如果没创建就马上创建,如果已经创建,就返回这个实例. 饿汉式,在加载这个类的时候就先创建好一个对象实例,等待调用. 两者的优缺点也能猜到,使用懒汉式,在反应速度上肯定要比饿汉式慢. 但是这个对象如果不被调用,那就节省了cpu和内存资

  • java 设计模式之单例模式

    java  设计模式之单例模式 前言: 在软件开发过程中常会有一些对象我们只需要一个,如:线程池(threadpool).缓存(cache).对话框.偏好设置等.这些对象如果制造出多个实例的话可能会导致一些不必要的麻烦,如:程序行为异常.资源使用过量等.这时单例模式就可以确保一个类只有一个实例,并提供全局访问点.下面是从简单的单例类来探讨该用何种方法实现单例模式. /** * 最经典的单例类 */ public class Singleton { // 设置成静态变量来记录Singleton的唯

  • 全面解析Java设计模式之单例模式

    本文实例为大家分享了Java设计模式之单例模式的具体代码,供大家参考,具体内容如下 概念: 单例模式:一个类中只有一个实例. 一个类有且仅有一个实例,并且提供了一个全局的访问点. 使用该模式的起因: 当我们在浏览网站时,有些网站会显示"当前在线人数".通常,实现这个功能的办法是将登陆的每一个IP存储在一个内存.文件或者数据库中,每多一个IP,就实现"+1".一般就是用一个方法,比如add(),实现"+1"的功能,比如用"update&q

  • Java设计模式之单例模式深入探索

    目录 什么是设计模式? 单例模式是什么? 单例模式设计的原则是什么? Java实现单例模式的5种方式? 懒汉 饿汉 静态内部类 双重校验锁DCL(Double Check Lock) 枚举(num) 小结 ❤️‍您好,我是贾斯汀,今天来聊一聊单例模式!❤️‍ 什么是设计模式? 百科: 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 设计模式是软件行业的通用的设计标准,在Java同样通用,主要有23种设计模式如下: 有的小伙伴可能会问,这么多,学得完吗? 答:不好意思

随机推荐