zoukankan      html  css  js  c++  java
  • OOAD-11 五大创建型模式之--单例模式

    package com.dding.pmsmigrateServer.web;
    
    public class Singlon {
        /**
         * 1、饿汉模式。直接定义为static final的域。仅在类加载时就定义且赋值。之后只能
         * 通过公开的接口来获取该instance实例。
         *
         * 优点:线程安全。因为在类加载时候就注入了。
         * 缺点:无论使不使用该类。都会去实例话那个唯一的对象。因此造成了内存的无端损耗
         */
        /*private static final Singlon instance = new Singlon();
    
        private Singlon(){};
    
        public static Singlon getInstance(){
            return instance;
        }*/
    
        /**
         * 2、饿汉模式。把instance的初始化放在静态代码块里面。和第一种方法非常相似。优缺点也一样。
         */
        /*private static Singlon instance;//加static保证类唯一
        static{
            instance = new Singlon();
        }
        private Singlon(){
    
        };
        public static Singlon getInstance(){
            return instance;
        }*/
    
    
        /**
         * 3、懒汉模式(线程不安全)
         * 优点:需要用到instance时候再去初始化,不会造成内存的无用消耗
         * 缺点:没有考虑线程安全,如果在多线程的环境下,会出现创建多个instance实例的问题
         */
        /*private static Singlon instance;
    
        private Singlon(){};
    
        public static Singlon getInstance(){
            if (null == instance){
                instance = new Singlon();
            }
            return instance;
        }*/
    
        /**
         * 4、懒汉模式(线程安全)
         * 优点:延迟加载,使用的时候再去初始化instance。且加了锁保证同一时间只有一个线程能去调用
         * getInstance()方法。保证多线程情况下的安全性
         * 缺点:多线程环境下效率太低了。每一次去获取实例时都要做加锁,也就是同步处理。就会造成线程阻塞。
         * 原本初始化instance只有一次。但是这么写导致了每次都要去加锁,判断有没有锁。不好
         */
        /*private static Singlon instance;
    
        private Singlon(){};
    
        public synchronized static Singlon getInstance(){
            if (null == instance){
                instance = new Singlon();
            }
            return instance;
        }*/
    
        /**
         * 5、懒汉模式(改良版线程安全)
         * 优点:延迟加载,保证线程安全性。且只在初始化instance的时候加锁。也就是只在第一次初始化的时候加锁来
         * 保证安全。之后的多线程获取实例,都不需要进行同步处理。极大的提高了效率
         */
        /*private static Singlon instance;
    
        private Singlon(){};
    
        public static Singlon getInstance(){
            if (null == instance){
                synchronized (Singlon.class){
                    if (null == instance){
                        instance = new Singlon();
                    }
                }
            }
            return instance;
        }*/
    
        /**
         * 6、枚举类型
         */
    
        /**
         * 使用枚举的单例模式
         * jvm保证enum不能被反射并且构造器方法只执行一次。
         */
        /*public class EnumSingleton{
            private EnumSingleton(){}
            public static EnumSingleton getInstance(){
                return Singleton.INSTANCE.getInstance();
            }
    
            private static enum Singleton{
                INSTANCE;
    
                private EnumSingleton singleton;
                //JVM会保证此方法绝对只调用一次
                private Singleton(){
                    singleton = new EnumSingleton();
                }
                public EnumSingleton getInstance(){
                    return singleton;
                }
            }
        }*/
    }
  • 相关阅读:
    一周以来工作总结关于位图索引
    再学学表的分区
    PostgreSQL学习笔记
    通过vc助手设置快捷注释
    c语言中unsigned类型和普通类型间的转换
    LVS环境搭建入门
    java学习路线
    linux下删除当前文件夹中按时间排序的前N个文件夹
    RHEL下安装jdk和tomcat
    TDD 强迫你 Program to Interface
  • 原文地址:https://www.cnblogs.com/exceptionblog/p/11062290.html
Copyright © 2011-2022 走看看