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();
        }
    
    }

    打印:

  • 相关阅读:
    java环境配置
    关于Chrome(谷歌浏览器)对docume,准确获取网页客户区的宽高、滚动条宽高、滚动条Left和Top
    CSS3圆角详解
    Js监控回车事件
    Sql日期时间格式转换
    JS操作JSON总结
    SQL日期操作及只获取日期的方法
    如何让div出现滚动条
    CodeForces 55D Beautiful numbers
    POJ 3034 Whac-a-Mole
  • 原文地址:https://www.cnblogs.com/android-deli/p/10235965.html
Copyright © 2011-2022 走看看