zoukankan      html  css  js  c++  java
  • Java中的懒汉式单例/饿汉式单例/双检索单例

    懒汉式单例:线程非安全,当被调用的时候才创建实例,效率较高

    public class LazySingleton {
        private static LazySingleton lazySingleton;
        private LazySingleton() {
            
        };
        //获取单例方法
        public static LazySingleton getLazySingleton() {
            if(lazySingleton==null) {
                lazySingleton = new LazySingleton();
                return lazySingleton;
            }else {
                return lazySingleton;
            }
        }
    }

    饿汉式单例:线程安全,程序加载的时候就创建实例,效率较低

    public class HungrySingleton {
        private static final HungrySingleton SINGLE_INSTANCE = new HungrySingleton();
        private HungrySingleton() {
            
        }
        //共有静态方法获取单例
        public static HungrySingleton getInstance() {
            return SINGLE_INSTANCE;
        }
    }

    使用main方法对单例进行测试,看看是否是同一个实例

    public class Main {
        public static void main(String[] args) {
            /**
             * 懒汉式单例调用过程
             */
            LazySingleton lazySingleton1 = LazySingleton.getLazySingleton();
            LazySingleton lazySingleton2 = LazySingleton.getLazySingleton();
            System.out.println(lazySingleton1==lazySingleton2);
            
            /**
             * 饿汉式单例调用过程
             */
            HungrySingleton hungrySingleton1 =HungrySingleton.getInstance();
            HungrySingleton hungrySingleton2 =HungrySingleton.getInstance();
            System.out.println(hungrySingleton1==hungrySingleton2);
        }
    }

    上面结果在控制台输出true,true。

    表示是同一个实例。

    第一次写博客,希望大家多多在下面评论,互相交流心得,鞠躬!!!

    双检索单例

    public class SingleDoubleCheckLock {
        private static volatile SingleDoubleCheckLock instance;
    
        public static SingleDoubleCheckLock getInstance() {
            if (instance == null) {
                synchronized (SingleDoubleCheckLock.class) {
                    if (instance == null) {
                        instance = new SingleDoubleCheckLock();
                    }
                }
            }
            return instance;
        }
    }

    synchronized和volatile的完美配合,便实现了线程安全的双检锁单例模式。

    volatile关键字特性
    volatile具有可见性、有序性,不具备原子性。
    volatile不具备原子性,这是volatile与java中的synchronized、java.util.concurrent.locks.Lock最大的功能差异

    volatile不会让线程阻塞,响应速度比synchronized高,这是它的优点。

  • 相关阅读:
    转载:山寨币凶猛
    Windows8.1 关机异常的解决
    Windows8、Windows8.1使用便签工具
    下载Sourceforge等国内无法下载站点文件的另一种方法
    专著出版成本计算
    PL2303 Windows8.1驱动
    转载:寒门再难出贵子
    华为荣耀品牌独立,子品牌战略能否实现新突破
    路由大战前夜,盘点智能路由的前世今生
    2020年实用工具推荐
  • 原文地址:https://www.cnblogs.com/zhanzhuang/p/8630027.html
Copyright © 2011-2022 走看看