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

    一、饿汉式

    /**
    * 饿汉式
    */
    public class Singleton01 {

    private static final Singleton01 instance = new Singleton01();

    private Singleton01(){}

    public static Singleton01 getInstance(){
    return instance;
    }

    public static void main(String[] args) {
    System.out.println(Singleton01.getInstance().hashCode());
    System.out.println(Singleton01.getInstance().hashCode());
    }
    }

    二、懒汉式

    /**
     * 懒汉式
     */
    public class Singleton02 {
    
        private static Singleton02 instance;
    
        private Singleton02(){}
    
        public static Singleton02 getInstance(){
            if(instance == null){
                instance = new Singleton02();
            }
            return instance;
        }
    
        public static void main(String[] args) {
            System.out.println(Singleton02.getInstance().hashCode());
            System.out.println(Singleton02.getInstance().hashCode());
        }
    }

    三、懒汉式线程不安全测试

    /**
    * 懒汉式 线程不安全测试
    */
    public class Singleton03 {

    private static Singleton03 instance;
    private static Object obj = new Object();

    private Singleton03(){}

    public static Singleton03 getInstance(){

    if(instance == null){
    try {
    Thread.sleep(1);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    instance = new Singleton03();

    }
    return instance;
    }

    public static void main(String[] args) {
    for(int i = 0; i< 100;i++) {
    new Thread (() ->{
    System.out.println(Singleton03.getInstance().hashCode());
    }).start();
    }
    }
    }

    四、懒汉式线程安全写法(坑),并不能保证线程安全

    /**
     * 懒汉式 线程不安全
     */
    public class Singleton03 {
    
        private static Singleton03 instance;
    
        private Singleton03(){}
    
        public static Singleton03 getInstance(){
    
                if(instance == null){
                    synchronized (Singleton03.class) {
                        try {
                            Thread.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        instance = new Singleton03();
                    }
                }
                return instance;
        }
    
        public static void main(String[] args) {
            for(int i = 0; i< 100;i++) {
                new Thread (() ->{
                    System.out.println(Singleton03.getInstance().hashCode());
                }).start();
            }
        }
    }

    5、懒汉式线程安全写法DCL,必须添加volatile关键字防止指令重排序

    /**
    * 懒汉式 线程安全
    */
    public class Singleton04 {

    private static volatile Singleton04 instance;

    private Singleton04(){}

    public static Singleton04 getInstance(){

    if(instance == null){
    synchronized (Singleton04.class) {
    if(instance == null){
    try {
    Thread.sleep(1);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    instance = new Singleton04();
    }
    }
    }
    return instance;
    }

    public static void main(String[] args) {
    for(int i = 0; i< 100;i++) {
    new Thread (() ->{
    System.out.println(Singleton04.getInstance().hashCode());
    }).start();
    }
    }
    }

    6、单例模式静态内部类实现

    /**
     * 静态内部类实现 线程安全
     */
    public class Singleton05 {
    
        private Singleton05(){}
    
        private static class SingletonHolder {
            private static final Singleton05 instance = new  Singleton05();
        }
    
        public static Singleton05 getInstance(){
            return SingletonHolder.instance;
        }
    
        public static void main(String[] args) {
            for(int i = 0; i< 100;i++) {
                new Thread (() ->{
                    System.out.println(Singleton05.getInstance().hashCode());
                }).start();
            }
        }
    }

    7、终极实现之枚举类,Joshua Bloch 的《effective java》中推荐写法,防止反射和反序列化并且线程安全

    /**
     * 枚举类实现 线程安全
     */
    public enum Singleton06 {
    
        instance;
        public static void main(String[] args) {
            for(int i = 0; i< 100;i++) {
                new Thread (() ->{
                    System.out.println(Singleton06.instance.hashCode());
                }).start();
            }
        }
    }
  • 相关阅读:
    C#使用CurrentUICulture切换语言
    XmlNode与XmlElement的区别总结
    git 怎样删除远程仓库的最近一次错误提交?
    Kermit,Xmodem,1K-Xmodem,Ymodem,Zmodem传输协议小结
    C#串口通信发送数据
    通过 Chrome 调试运行在 IOS-safari 上的页面
    display:flex不兼容Android、Safari低版本的解决方案 【flex布局】
    jquery获取<div></div>之间的内容.text() 和 .html()区别
    vscode格式化代码无效--可能的解决方法
    git pull出现fatal: unable to access 'https://github.com/XXX/YYY.git'
  • 原文地址:https://www.cnblogs.com/sx-bj-srr/p/12772661.html
Copyright © 2011-2022 走看看