JAVA 设计模式之单例模式有以下几种:懒汉式、饿汉式,双重检查,静态内部类等,其中主要区别是看能不能传参,以及线程安全不安全。
1、懒汉式,不能传参,线程不安全。
public class Singleton { private static final Singleton ourInstance = new Singleton(); public static Singleton getInstance() { return ourInstance; } private Singleton() { } }2、 饿汉式,能传参,线程不安全。
public class Singleton { private static Singleton ourInstance ; public static Singleton getInstance() { if (ourInstance == null) { ourInstance = new Singleton(); } return ourInstance; } private Singleton() { } }
3、双重检查,能传参,线程安全。可使用volatile关键字,一保证了不同线程对这个变量进行操作时的可见性,
即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的;二禁止进行指令重排序。
public class Singleton { //线程并发时,当变量被改动了,所有的线程都能即时访问到最新的数据 //会屏蔽掉虚拟机的一些代码优化 private volatile static Singleton ourInstance ; public static Singleton getInstance() { if (ourInstance == null) { synchronized (Singleton.class){ if (ourInstance == null) { ourInstance = new Singleton(); } } } return ourInstance; } private Singleton() { } }
4、静态内部类,不能传参,线程安全。
//可以延迟加载,也能线程安全
public class Singleton { private Singleton() { } private static class SingletonHolder{ //静态内部类的静态属性实例化时,由JVM保证线程的安全 private static Singleton instance = new Singleton(); } //只有调用了getInstance方法之后,才会实例化Singleton instance属性 public static Singleton getInstance(){ return SingletonHolder.instance; } }5 、单例扩展,用于对象池。
public class Connection { private static int max = 5; private static Map<Integer,Connection> map = new HashMap<Integer,Connection>(); private static int key = 1; public static Connection getConnection(){ Connection instance = map.get(key); if (instance == null){ instance = new Connection(); map.put(key,instance); } key++; if (key>max){ key=1; } return instance; } }
调用 :Connection.getConnection()
6 其他 枚举,Java中很少用。
public enum MyEnum { // a ,b,c,d RED(1,"red"),BLUE(2,"BLUE"); private int index; private String name; MyEnum(int index,String name){ this.index=index; this.name=name; } public int getIndex(){ return index; } public String getName(){ return name; } }