美文网首页
编程设计模式01——单例模式

编程设计模式01——单例模式

作者: 小刘灰灰 | 来源:发表于2019-12-05 13:49 被阅读0次

    1.单例模式定义在Android中的使用

    单例模式在项目中唯一持久存在的模式,而且为整个系统提供这个实例。处理一些全局多次相同处理方式的任务。

    2.单例模式的分类

    2.1 最简单的饿汉式单例
    package com.example.testlibary;
    
    public class Singleton {
        private static final Singleton SINGLETON = new Singleton();
        //自己实现私有构造方法,无法生成多个实例对象
        private Singleton() {
        }
        //通过该方法获取实例  存在的问题项目在初始化的该实例就会存在  
       //如果不用的话会存在资源的浪费
        public static Singleton getSingleton() {
            return SINGLETON;
        }
    }
    
    2.2 懒汉式
    public class Singleton {
        //不加final 加了就不能初始化了
        private static Singleton singleton = null;
    
        private Singleton() {
        }
    
        //这个是线程不安全的 项目中能存在多个 Singleton的实例
        public static Singleton getSingleton() {
            if (singleton == null) {
                singleton = new Singleton();
            }
            return singleton;
        }
    }
    
    加锁的懒汉式线程式安全的。
        //不加final 加了就不能初始化了
        private static Singleton singleton = null;
    
        private Singleton() {
        }
    
        //synchronized  加上一个锁 线程安全的
        //存在问题是     
        public static  synchronized Singleton getSingleton() {
            if (singleton == null) {
                singleton = new Singleton();
            }
            return singleton;
        }
    }
    
    更加高级的懒汉式线程安全的
    public class Singleton {
        // 4DCL模式(双重检查锁定模式)
        //volatile 内存同步共享修饰  线程安全的
        //可见性。对一个 volatile 变量的读,总是能看到(任意线程)对这个 volatile 变量最后的写入。
        //原子性:对任意单个 volatile 变量的读 / 写具有原子性,但类似于 volatile++ 这种复合操作不具有原子性。
        private static volatile Singleton singleton = null;
    
        private Singleton() {
        }
    
        //synchronized  加上一个锁 线程安全的
        //存在问题是     
        public static Singleton getSingleton() {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
    
            }
            return singleton;
        }
    }
    

    volatile关键字能够保证可见性,被volatile修饰的变量,在一个线程中被改变时会立刻同步到主内存中,而另一个线程在操作这个变量时都会先从主内存更新这个变量的值。
    关于类锁,对象锁的问题自行百度吧,在单例中区别不大

    3.个人推荐使用的单例模式 静态内部类的模式

    public class Singleton {
    
        private Singleton() {
        }
        public Singleton getInstance(){
            return SingleTonHolder.singleton;
        }
    
        private static class SingleTonHolder {
            private  final static Singleton singleton=new Singleton();
        }
    }
    

    4.还有一种是枚举的单例模式这个不是很常用的。

    public enum  SingleTonA {
        SINGLETONA;
        //添加自己需要的操作
        public void method(){
        }
    
    }
    
    5.单例应该在使用时应该注意的地方

    持有Activity对象或者Content对象,导致当前Activity等无法释放,造成的内存泄漏的问题。(context泄漏)。

    相关文章

      网友评论

          本文标题:编程设计模式01——单例模式

          本文链接:https://www.haomeiwen.com/subject/xrcdgctx.html