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

    打印:

  • 相关阅读:
    Eclipse CDT 调试故障解决:Can't find resource for bundle java.util.PropertyResourceBundle
    winpcap 枚举网卡设备Demo
    ORCA msi修改工具 解决 msn 卡巴斯基 iTune等不能在Windows Server 2003下安装的问题
    收藏 彩色转灰度的舍入问题
    C++之仿函数
    CTreeCtrl icon 背景透明 解决方法
    colinux 运行和配置
    生成COM Dll的tlb文件的两种方法
    windows下建立gcc/g++/gdb/make编译及调试C/C++的IDE环境
    使用伪寄存器调试MSVC++程序的介绍An introduction to debugging in MSVC++ using Pseudoregisters
  • 原文地址:https://www.cnblogs.com/android-deli/p/10235965.html
Copyright © 2011-2022 走看看