zoukankan      html  css  js  c++  java
  • 设计模式笔记--单例

    饿汉模式

    // 它是在类加载的时候就立即初始化,并且创建单例对象
    
        //优点:没有加任何的锁、执行效率比较高,
        //在用户体验上来说,比懒汉式更好
    
        //缺点:类加载的时候就初始化,不管你用还是不用,我都占着空间
        //浪费了内存,有可能占着茅坑不拉屎
    
        //绝对线程安全,在线程还没出现以前就是实例化了,不可能存在访问安全问题
    public class Hungry {
    
        private static final Hungry instance = new Hungry();
    
        private Hungry() {
            System.out.println(">>>>>create");
        }
    
        public static Hungry getInstance() {
            return instance;
        }
    
    }
    
    

    测试

    public class Test implements Runnable {
    
    
        public void run() {
            Hungry.getInstance();
        }
    
        public static void main(String[] args) {
            for (int i = 0; i < 100; i++) {
                new Thread(new Test()).start();
            }
        }
    }
    

    结果

    >>>>>create
    

    懒汉模式

    1、线程安全类型:

    public class LazyOne {
        private static LazyOne LAZY_ONE;
    
        private LazyOne() {
            System.out.println(">>>>create LazyOne");
        }
    
        public static LazyOne getInstance() {
            if (LAZY_ONE == null) {
                LAZY_ONE = new LazyOne();
            }
            return LAZY_ONE;
        }
    }
    

    结果:

    >>>>create LazyOne
    >>>>create LazyOne
    

    2、同步类型

    public class LazyTwo {
        private static LazyTwo lazyTwo;
    
        private LazyTwo() {
            System.out.println(">>>>create LazyTwo");
        }
    
        public static LazyTwo getInstance() {
            if (lazyTwo == null) {
                synchronized (LazyTwo.class) {
                    if (lazyTwo == null) {
                        lazyTwo = new LazyTwo();
                    }
                }
            }
            return lazyTwo;
        }
    }
    

    结果:

    >>>>create LazyTwo
    

    3、使用静态内部类避免同步带来的性能消耗

    public class LazyThree {
    
        private static class LazyHolder {
            private static final LazyThree lazy_three = new LazyThree();
        }
    
        private LazyThree() {
            System.out.println(">>>>create LazyThree");
        }
    
        public static LazyThree getInstance() {
            return LazyHolder.lazy_three;
        }
    }
    

    结果:

    >>>>create LazyThree
    
  • 相关阅读:
    c++ 用宏代替常用的函数
    爬取网易云音乐(包括歌词和评论)
    三种常见的单例模式
    函数式编程filter和map的区别
    四种常见排序算法(快速,冒泡,插入,选择排序)
    6.微信撤回消息的获取
    5.微信拜年短信自动回复
    4.深拷贝和浅拷贝
    3.迭代器以及迭代器的作用
    2.生成器计算出斐波那契数列
  • 原文地址:https://www.cnblogs.com/lanqie/p/8588282.html
Copyright © 2011-2022 走看看