zoukankan      html  css  js  c++  java
  • 单例模式(设计模式_10)

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

    饿汉式单例模式举例:

    /*
     *  饿汉式单例模式
     *  饿汉式的这种单例模式是线程安全的
     *  需要根据业务需求来觉得要不要使用饿汉式单例模式
     */
    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升级版....");
        }
    

    测试程序:

    // 测试程序
    public class Main {
    
        public static void main(String[] args) {
    
            SingletonHungry.getInstance().printlnMethod();
    
            SingletonLazy.getInstance().printlnMethod();
    
            SingletonUpdate.getInstance().printlnMethod();
    
        }
    
    }

    运行结果:
    这里写图片描述

    单例模式还有很多种实现方式,只是列举了普遍的三种给大家分享!!!


    例如我在举例一种:
    静态内部类单例模式:

    /*
     * 内部静态类 单例模式
     */
    public class SingletonState {
    
        public SingletonState() {
            // TODO Auto-generated constructor stub
        }
    
        private static class SingletonClass {
            public static SingletonState singletonState = new SingletonState();
        }
    
        public static SingletonState getNewInstance() {
            return SingletonClass.singletonState;
        }
    
        public void printlnMethod() {
            System.out.println("内部静态类 单例模式...");
        }
    
    }

    还有枚举方式的,….. 省略 , 就不写了, 谢谢大家观看!!!!!!!!


    谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
    刘德利CSDN博客, http://blog.csdn.net/u011967006

  • 相关阅读:
    Java学习-sgg-day09-20200425
    Java学习-sgg-day08-20200423
    C#集合
    C#类型转换
    HTML+CSS注意知识点
    easyUI学习(1)
    sort方法根据数组中对象的某一个属性值进行排序
    Vue Router 知识点梳理(二)
    Vue Router 知识点梳理
    浏览器加载、解析、渲染的过程
  • 原文地址:https://www.cnblogs.com/android-deli/p/10322218.html
Copyright © 2011-2022 走看看