• JAVA之单例模式


     JAVA设计模式中单例的思维导图如下:

    1、懒汉模式,线程不安全

    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
      
        public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    }

    2、懒汉式,线程安全

    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
        public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    }

    3、饿汉式

    public class Singleton {  
        private static Singleton instance = new Singleton();  
        private Singleton (){}  
        public static Singleton getInstance() {  
        return instance;  
        }  
    }

    4、双检锁/双重校验锁

    双检锁的方式中用到了volatile关键字,volatile关键字的作用是可见性和禁止指令重排序。

    可见性:意思是其他线程修改了被volatile标识的变量,其值可以立即同步到主内存,读取的时候也是从主内存中读取。

    禁止指令重排序:在java多线程运行的时候,为了能够充分利用CPU,JVM有一些特殊的机制就是把程序执行的顺序打乱,写在后面的代码可能会先执行。而volatile禁止了这个优化。另外synchronized也禁止重排序。

    public class Singleton {  
        private volatile static Singleton singleton;  
        private Singleton (){}  
        public static Singleton getSingleton() {  
        if (singleton == null) {  
            synchronized (Singleton.class) {  
            if (singleton == null) {  
                singleton = new Singleton();  
            }  
            }  
        }  
        return singleton;  
        }  
    }

    5、登记式/静态内部类

    public class Singleton {  
        private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
        }  
        private Singleton (){}  
        public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
        }  
    }

    6、枚举

    public enum Singleton {  
        INSTANCE;  
        public void WhoIAM() {  
            System.out.println("i am one" + this.hashCode());
        }  
    }
    public class TestMain {
        public static void main(String[] args) {
            Singleton singleton1 = Singleton.INSTANCE;
            singleton1.WhoIAM();
            Singleton singleton2 = Singleton.INSTANCE;
            singleton2.WhoIAM(); 
    Singleton singleton3
    = Singleton.INSTANCE;
    singleton3.
    WhoIAM();
    } }

    枚举是JDK5版本后的特性,代码简单,创建枚举类之后通过Singleton.INSTANCE得到同一个实例。通过调用hashCode()方法可以知道是同一个实例。

  • 相关阅读:
    你的服务器和网站为什么会被反复入侵
    MAC 查看当前安装的JDK位置
    Jmeter高并发测试
    解密AndroidManifest.xml、AXMLPrinter2.jar源码下载
    Win10家庭版如何启用本地组策略
    SQLFlow使用中的注意事项--设置篇
    Sqlflow 之隐私政策(Privacy plolicy)介绍
    血缘关系分析工具SQLFLOW--实践指南
    Oracle SQL 性能优化利器
    SQLFlow数据流分析工具的job功能介绍
  • 原文地址:https://www.cnblogs.com/schoolbag/p/9468091.html
Copyright © 2020-2023  润新知