Android-Java单例模式

今天我们来说说一个非常常用的模式,单例模式,单例模式让某个类中有自己的实例,而且只实例化一次,避免重复实例化,单例模式让某个类提供了全局唯一访问点,如果某个类被其他对象频繁使用,就可以考虑单例模式,以下用代码来分析:

饿汉式单例模式举例:

/*
 *  饿汉式单例模式
 *  饿汉式的这种单例模式是线程安全的
 *  需要根据业务需求来觉得要不要使用饿汉式单例模式
 */
public class SingletonHungry {

    /*
     * 直接以变量的形式实例化了当前对象,并进行了私有化,(这种方式的话在不管被不被使用,就已经实例化)
     */
    private static SingletonHungry singletonHungry = new SingletonHungry();

    public static SingletonHungry getInstance() {
        return singletonHungry;
    }

    public void printlnMethod() {
        System.out.println("线程安全的饿汉式单例模式...");
    }

}

懒汉式单例模式

// 懒汉式单例模式
// 懒汉式的这种单例模式是线程不安全的,因为多线程并发性调用就会引发线程不安全问题
// 需要根据业务需求来觉得要不要使用懒汉式单例模式

public class SingletonLazy {

    /*
     * 首先申明一个对象变量,变量都是必须私有化
     */
    private static SingletonLazy singletonLazy = null;

    public static SingletonLazy getInstance() {

        if (null == singletonLazy) {
            singletonLazy = new SingletonLazy();
        }
        return singletonLazy;

    }

    public void printlnMethod() {
        System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全");
    }
}

以上的懒汉式单例模式,有不足之处,所以以下这个案例就是解决多线程并发调用引发的不安全问题:

/*
 * 之前提到的懒汉式单例模式,存在多线程并发调用引发线程不安全问题,现在就增加同步来解决这个问题
 */
public class SingletonUpdate {

    private static SingletonUpdate singletonUpdate = null;

    public static SingletonUpdate getInstance() {
        if (null == singletonUpdate) {
            synchronized (SingletonUpdate.class) {
                if (null == singletonUpdate) {
                    singletonUpdate = new SingletonUpdate();
                }
            }
        }
        return singletonUpdate;
    }

    public void printlnMethod() {
        System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全
          这个是Update升级版....");
    }

关于线程的安全问题,对于为什么会出现安全问题,可以看Android-多线程安全问题-synchronized博客

测试程序:

// 测试程序
public class Main {

    public static void main(String[] args) {

        SingletonHungry.getInstance().printlnMethod();

        SingletonLazy.getInstance().printlnMethod();

        SingletonUpdate.getInstance().printlnMethod();

    }

}

运行结果: 


静态内部类 单例模式:

package android.java.thread13;

/*
 * 内部静态类 单例模式
 */
class SingletonState {

    private SingletonState() {}

    private static class SingletonClass {
        public static SingletonState singletonState = new SingletonState();
    }

    public static SingletonState getNewInstance() {
        return SingletonClass.singletonState;
    }

    public void printlnMethod() {
        System.out.println("内部静态类 单例模式...");
    }

}

使用 静态内部类 单例模式:

package android.java.thread13;

/**
 * 使用内部静态类 单例模式
 */
public class Main {

    public static void main(String[] args) {
        // new SingletonState(); // 会报错 ❌
        // new SingletonState(参数); // 会报错 ❌

        // 实例化 内部静态类 单例模式
        SingletonState singletonState = SingletonState.getNewInstance();
        singletonState.printlnMethod();
    }

}

打印:

猜你喜欢

转载自www.cnblogs.com/android-deli/p/10235965.html
今日推荐