单例模式
饿汉式单例模式
1 2 3 4 5 6 7
| public class LazyMan(){ private LazyMan(){} private final static LazyMan LAZYMAN=new LazyMan(); public LazyMan getInstance(){ return LAZYMAN; } }
|
==盲目的没有条件的新建对象,会造成内存的浪费==
懒汉式单例模式
1 2 3 4 5 6 7
| public class LazyMan(){ private LazyMan(){} private final static LazyMan LAZYMAN; public LazyMan getInstance(){ return new LazyMan(); } }
|
但是上面的程序在多线程情况下没有安全性可言,于是有了DSL(双锁单例模式),实际上更像是一个三🔒的模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
class SigleTon { private static boolean flag = true;
private SigleTon () { synchronized (SigleTon.class) { if (flag ==true) { flag = false; } else { throw new RuntimeException ("?????"); } } System.out.println (Thread.currentThread ().getName () + "\tOK"); }
private volatile static SigleTon singleton;
public static SigleTon getInstance () { if (singleton == null) { synchronized (SigleTon.class) { if (singleton == null) { singleton = new SigleTon (); } return singleton; } } else return singleton; } }
|
内部类实现
1 2 3 4 5 6 7 8 9 10 11
| class Single{ public Single () { }
public static Single getInstance(){ return inner.SINGLE; } private static class inner{ private static Single SINGLE=new Single (); } }
|
但是这个也不是很安全,我们可以利用反射破坏结构;
所以使用枚举来实行单例模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package JUC.Sigle;
public enum EnumSigle {
INSTANCE;
EnumSigle () { System.out.println (Thread.currentThread ().getName ()); }
public static EnumSigle getInstance(){ return INSTANCE; } public void fun(){ System.out.println (this); }
public static void main (String[] args) { for (int i = 0; i <1000 ; i++) { new Thread (()-> EnumSigle.getInstance ()).start (); } } }
|