java 懶漢式、餓漢式單例模式 含多線程的狀況

//餓漢式 提早生成了單例對象
class Singleton{ private static final Singleton instance=new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; } } //懶漢式 調用的時候纔會生成對象
class Singleton11 { private static Singleton11 instance; private Singleton11(){} public static Singleton11 getInstance(){ if (instance==null) { instance=new Singleton11(); } return instance; } } //多例模式
class Color { private static final Color Red=new Color("紅色"); private static final Color Green=new Color("綠色"); private static final Color Blue=new Color("藍色"); private String color; private Color(String color){ this.color=color; } public static Color getInstance(String color){ switch (color) { case "紅色": return Red; case "綠色": return Green; case "藍色": return Blue; default: return null; } } public String print(){ return this.color; } } public class TestSingleton{ public static void main(String[] args){ Singleton A=Singleton.getInstance(); Singleton B=Singleton.getInstance(); System.out.println(A==B); Singleton11 A11=Singleton11.getInstance(); Singleton11 B11=Singleton11.getInstance(); System.out.println(A11==B11); Color red=Color.getInstance("紅色"); Color green=Color.getInstance("綠色"); Color blue=Color.getInstance("藍色"); System.out.println(red.print()); System.out.println(green.print()); System.out.println(blue.print()); } }

 

多線程的狀況:多線程

class Singleton{ private static volatile Singleton instance=null;  //直接操做主內存 比操做副本效果好
    private Singleton(){ System.out.println(Thread.currentThread().getName()+"******實例化Singleton******"); } public static Singleton getInstance(){ if (instance==null){ synchronized (Singleton.class){  //此處同步的是new Singleton() 提高多線程效率
                if (instance==null){         //此處的判斷 對應上面的if (instance==null) 多個線程進來
                    instance=new Singleton(); } } } return instance; } public void print(){ System.out.println("wwww.mldn.com"); } } public class SingleInstance { public static void main(String[] args) { // Singleton s=Singleton.getInstance(); // s.print(); // Singleton ss=Singleton.getInstance(); // ss.print(); // System.out.println(s==ss);
         for (int i=0;i<3;i++){ new Thread(()-> System.out.println(Singleton.getInstance()),"單例"+i).start(); } } }
相關文章
相關標籤/搜索