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

  • 相关阅读:
    learn go memoization
    learn go return fuction
    Java5 并发学习
    Java中的protected访问修饰符
    LinkedBlockingQueue
    BlockingQueue的使用
    Java并发编程:Callable、Future和FutureTask
    Java线程池的工作原理与实现
    SQL Server中Delete语句表名不能用别名
    请问JDBC中IN语句怎么构建
  • 原文地址:https://www.cnblogs.com/schoolbag/p/9468091.html
Copyright © 2011-2022 走看看