zoukankan      html  css  js  c++  java
  • Java单例模式实现的两种方式和应用场景

    单例模式的定义

    个人理解,单例是指单个实例,在整个应用程序当中有且仅有一个实例存在,该实例是通过代码指定好的(自行创建的)。

    为什么要使用

    1. 解决在高并发过程中,多个实例出现逻辑错误的情况。
    2. 在特定的业务场景下避免对象重复创建,节约内存。

    实现的两种方式

    饿汉式

    顾名思义,不管有没有使用到该对象,只要程序启动成功,该单实例对象就存在。

    代码如下:

    /**
     * 饿汉式
     */
    public class SingletonHungry {
    
    
        private static SingletonHungry instance = new SingletonHungry();
    
        public static SingletonHungry instance(){
            return instance;
        }
    
        public static void main(String[] args) {
            SingletonHungry instance1 = SingletonHungry.instance();
            SingletonHungry instance2 = SingletonHungry.instance();
            System.out.println(instance1);
            System.out.println(instance2);
        }
    }
    

    上述情况,满足在单线程和多线程中使用。

    懒汉式

    顾名思义,只有在程序当中使用到该对象的时候,该单实例对象才会被实例化。

    代码如下:

    /**
     * 懒汉式-单线程
     */
    public class SingletonLazy {
    
        public static SingletonLazy instance = null ;
    
        public static SingletonLazy instance() {
            if(instance == null) {
                instance = new SingletonLazy() ;
            }
    
            return instance ;
        }
    }
    

    上述编写的代码中,乍一看,没问题,满足了单实例对象。可是细细一琢磨,咋感觉这不对,如果多线程情况下,就很难保证单实例对象了。下面提供一种多线程情况下实现单例的方式:

    /**
     * 懒汉式-多线程
     */
    public class SingletonLazy {
    
        public static SingletonLazy instance = null ;
    
        public static SingletonLazy instance() {
    
            if(instance == null ) {
                synchronized (SingletonLazy.class) {
                    if(instance == null) {
                        instance = new SingletonLazy();
                    }
                }
            }
            return instance ;
        }
    }
    

    上述的代码中满足了多线程的使用场景,就是使用了上锁+双重检查来进行实现。

    欢迎交流!

    充满鲜花的世界到底在哪里
  • 相关阅读:
    ORACLE 计算时间相减间隔
    oracle中游标详细用法
    oracle中计算某月的天数
    Unity3D导出的EXE不用显示分辨率选择界面
    Unity3D 之暂停和继续的实现
    double的值太大,以及补0
    Unity3D鼠标点击物体产生事件
    java POi excel 写入大批量数据
    Unity3D 判断鼠标是否按在UGUI上
    Unity3D 之UGUI 滚动条
  • 原文地址:https://www.cnblogs.com/aliases/p/15151201.html
Copyright © 2011-2022 走看看