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

2019-12-05  本文已影响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泄漏)。

上一篇下一篇

猜你喜欢

热点阅读