關於singleton的幾個實現

渣渣演發表於2016-03-26
public class Singleton {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
}
private static Singleton instance;
/**將構造器使用private修飾,隱藏該構造器**/
private Singleton(){
System.out.println("Singleton被構造!");
}
/**執行緒安全,但效能有待優化,這樣寫每次呼叫getInstance方法都需要同步。
實際上只是第一次載入需要同步**/
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}




public class Singleton2 {
/**注意volatile的修飾,有待改進吧**/
private static Lock lock=new ReentrantLock();
private static volatile Singleton2 uniqueInstance;
private Singleton2() {
}
public static void main(String[] args) {
Singleton2 s1 = Singleton2.getInstance();
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s1 == s2);
}

public static Singleton2 getInstance() {
if(uniqueInstance == null) {
lock.lock();
try {
/**double check**/
if(uniqueInstance == null)
uniqueInstance = new Singleton2();
}catch (Exception e){
}finally {
lock.unlock();
}
}
return uniqueInstance;
}
}




public class SingletonTest {
/**注意volatile關鍵字,這個方法還是不錯的**/
private static volatile SingletonTest instance = null;

private SingletonTest() {
}

public static void main(String[] args) {
SingletonTest s1 = SingletonTest.getInstance();
SingletonTest s2 = SingletonTest.getInstance();
System.out.println(s1 == s2);
}

private static synchronized void syncInit() {
if (instance == null) {
instance = new SingletonTest();
}
}

public static SingletonTest getInstance() {
if (instance == null) {
syncInit();
}
return instance;
}
}




public class Singleton_thread {
/**私有構造方法,防止被例項化**/
private Singleton_thread() {
}

public static void main(String[] args) {
Singleton_thread s1 = Singleton_thread.getInstance();
Singleton_thread s2 = Singleton_thread.getInstance();
System.out.println(s1 == s2);
}

/**此處使用一個內部類來維護單例,類的載入執行緒互斥**/
private static class SingletonFactory {
private static Singleton_thread instance = new Singleton_thread();
}

/**獲取例項**/
public static Singleton_thread getInstance() {
return SingletonFactory.instance;
}

}

相關文章