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高,这是它的优点。

  • 相关阅读:
    Running ASP.NET Applications in Debian and Ubuntu using XSP and Mono
    .net extjs 封装
    ext direct spring
    install ubuntu tweak on ubuntu lts 10.04,this software is created by zhouding
    redis cookbook
    aptana eclipse plugin install on sts
    ubuntu open folderpath on terminal
    ubuntu install pae for the 32bit system 4g limited issue
    EXT Designer 正式版延长使用脚本
    用 Vagrant 快速建立開發環境
  • 原文地址:https://www.cnblogs.com/zhanzhuang/p/8630027.html
Copyright © 2011-2022 走看看