zoukankan      html  css  js  c++  java
  • 单例模式

    1.单例模式:保证整个系统中一个类只能有一个实例,而且这个实例只能是自身创建。外部不能直接创建对象(不能new)只能通过类中的固定方法获取。

    2.单例模式类型:

      01.懒汉式:(在调用的时候实例化)

    public class DanLi {
    
        // 私有化构造,防止外部直接调用
        private DanLi() {
        }
    
        // 创建私有化的变量
        private static DanLi danLi = null;
    
        // 创建静态工厂
        public static DanLi getInstance() {
            if (danLi == null) {
                danLi = new DanLi();
            }
            return danLi;
        }
    
    }
    懒汉

        线程不安全,当多个线程同时调用该方法的时候,就会创建多个实例。为了实现线程安全可以采用:

        001.添加同步校验锁

    public class DanLi {
    
        // 私有化构造,防止外部直接调用
        private DanLi() {
        }
    
        // 创建私有化的变量
        private static DanLi danLi = null;
    
        // 创建静态工厂
        public static synchronized DanLi getInstance() {
            if (danLi == null) {
                danLi = new DanLi();
            }
            return danLi;
        }
    
    }
    同步锁

        002.双重锁

    public class DanLi {
    
        //私有化构造,防止外部直接调用
        private DanLi(){}
        //创建私有化的变量
        private static DanLi danLi = null;
        //创建静态工厂
        public static synchronized DanLi getInstance(){
            if (danLi == null) {
                synchronized (DanLi.class) {
                    if (danLi == null) {
                        danLi = new DanLi();
                    }
                }
            }
            return danLi;
        }
        
    }
    双重锁

        003.静态内部类

    public class DanLi {
    
        // 私有化构造,防止外部直接调用
        private DanLi() {
        }
    
        private static class LazyHolder {
            private static final DanLi INSTANCE = new DanLi();
        }
    
        // 创建静态工厂
        public static DanLi getInstance() {
            return LazyHolder.INSTANCE;
        }
    
    }
    静态内部类

      02.饿汉式:(在初始化时自动进行实例化)

        在创建类的同时就已经创建好了一个静态的对象供系统使用,以后也不会再改变,故线程安全

    public class DanLi {
    
        // 私有化构造,防止外部直接调用
        private DanLi() {
        }
    
        private static final DanLi danli = new DanLi();
        
        public static DanLi getInstance(){
            return danli;
        }
    
    }
    饿汉
  • 相关阅读:
    android中requestFocus
    @SuppressLint("NewApi")和@TargetApi()的区别
    Gradle基础
    Gradle build-info.xml not found for module app.Please make sure that you are using gradle plugin '2.0.0-alpha4' or higher.
    Duplicate files copied in APK META-INF/DEPENDENCIES
    解决Gradle DSL method not found: ‘android()’
    SSL peer shut down incorrectly
    如何测试远端TCP和UDP端口是否开放
    方法总比困难多
    图灵简传
  • 原文地址:https://www.cnblogs.com/milu0620/p/6995715.html
Copyright © 2011-2022 走看看