zoukankan      html  css  js  c++  java
  • 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();
        }
    
    }

    打印:

  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/android-deli/p/10235965.html
Copyright © 2011-2022 走看看