Java多執行緒之單例模式-yellowcong
阿新 • • 發佈:2019-02-12
我們常見的單利模式有餓漢式和懶漢式,懶漢式,就是在用的時候,再例項化物件,餓漢式,是還沒有開飯,就已經把物件例項化好了。在多執行緒開發中,解決單例的時候,有兩種解決方案,1、(懶漢式)同步程式碼塊雙判斷,2、(餓漢式)直接例項化好靜態類,呼叫的時候,直接返回
懶漢式(1、雙判斷,2、同步函式)
1、雙判斷,效率比同步函式高
2、直接給獲取例項化的方法加上同步操作,如果多個物件例項化獲取,效率比較低
package com.yellowcong.queue.demo;
/**
* 建立日期:2017年10月5日 <br/>
* 建立使用者:yellowcong <br/>
* 功能描述:
*/
public class DoubleSingleton {
private static DoubleSingleton ds = null;
//直接給獲取例項化的方法加上同步操作
public static synchronized DoubleSingleton getInstance2(){
if(ds == null){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ds= new DoubleSingleton();
}
return ds;
}
/**
* 建立日期:2017年10月5日<br/>
* 建立使用者:yellowcong<br/>
* 功能描述:獲取例項
* @return
*/
public static DoubleSingleton getInstance(){
if(ds == null){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//業務處理
synchronized (DoubleSingleton.class) {
if(ds == null){
ds= new DoubleSingleton();
}
}
}
return ds;
}
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
DoubleSingleton ds= DoubleSingleton.getInstance();
System.out.println(ds.hashCode());
}
}).start();
new Thread(new Runnable() {
public void run() {
DoubleSingleton ds= DoubleSingleton.getInstance();
System.out.println(ds.hashCode());
}
}).start();
new Thread(new Runnable() {
public void run() {
DoubleSingleton ds= DoubleSingleton.getInstance();
System.out.println(ds.hashCode());
}
}).start();
}
}
餓漢式
物件在呼叫這個類的時候,就例項化好,呼叫getInstance方法的時候,直接返回
package com.yellowcong.queue.demo;
/**
* 建立日期:2017年10月5日 <br/>
* 建立使用者:yellowcong <br/>
* 功能描述:
*/
public class InnerSingleton {
private static InnerSingleton ds = new InnerSingleton();
/**
* 建立日期:2017年10月5日<br/>
* 建立使用者:yellowcong<br/>
* 功能描述:獲取例項
* @return
*/
public static InnerSingleton getInstance(){
return InnerSingleton.ds;
}
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
InnerSingleton ds= InnerSingleton.getInstance();
System.out.println(ds.hashCode());
}
}).start();
new Thread(new Runnable() {
public void run() {
InnerSingleton ds= InnerSingleton.getInstance();
System.out.println(ds.hashCode());
}
}).start();
new Thread(new Runnable() {
public void run() {
InnerSingleton ds= InnerSingleton.getInstance();
System.out.println(ds.hashCode());
}
}).start();
}
}