zoukankan      html  css  js  c++  java
  • 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()方法可以知道是同一个实例。

  • 相关阅读:
    Windows下快速搭建安卓开发环境android-studio
    使用Android Studio搭建Android集成开发环境
    手动安装配置Android Studio
    android studio 各种问题 应该能帮助到你们
    如何清除XP的网络共享密码
    一个语言的“入流”,而是和这种语言进入某一子行业的契机有关
    必须冷静、必须听话,赶紧走
    QWidget继承自QPaintDevice,这样就可以直接把QWidget传入QPainter的构造函数,比如QPainter(mylabel),然后设置QWidget的长宽后直接进行作画了
    ActiveMQ
    开源word操作组件DocX的记录
  • 原文地址:https://www.cnblogs.com/schoolbag/p/9468091.html
Copyright © 2011-2022 走看看