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()方法可以知道是同一个实例。

  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/schoolbag/p/9468091.html
Copyright © 2011-2022 走看看