※餓漢式單例
public class Singleton {
private static final Singleton SINGLETON = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return SINGLETON;
}
}
※類別載入就創建物件,執行效率高,但浪費記憶體
※懶漢式單例
public class Singleton {
private static Singleton singleton = null;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
※第一次請求實體才會創建物件,但必須要用synchronized
※如果不用 synchronized 有可能會有多個實體,因為Parallel程序可能會進入,如下:
public class Singleton {
private static Singleton singleton = null;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
singleton = new Singleton();
}
return singleton;
}
}
public class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
public static void main(String... ss) {
/*Runnable my = () -> {
System.out.println(Singleton.getInstance());
};*/
MyThread my = new MyThread();
for(int i=1; i<=5; i++){
new Thread(my).start();
}
}
}
※停一秒鐘,然後 Parallel,就有可能會有2個實體
※註解是 Java8 的 lambda 寫法,此時可以不用 implements Runnable 和實作
※1.設定 msconfig
2.設定 taskmgr,針對java、javaw、Eclipse 使用一顆 CPU,還是一樣的結果,不知道為什麼
理論上單核是不會有併行的
※登記式單例
public class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return InnerSingleton.SINGLETON;
}
private static class InnerSingleton {
private static final Singleton SINGLETON = new Singleton();
}
}
※綜合餓漢和懶漢的最佳單例
沒有留言:
張貼留言