本篇文章給大家分享的是有關java中單例的優缺點有哪些,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創新互聯建站網站建設提供從項目策劃、軟件開發,軟件安全維護、網站優化(SEO)、網站分析、效果評估等整套的建站服務,主營業務為網站建設、成都網站制作,手機APP定制開發以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業、用心的態度為用戶提供真誠的服務。創新互聯建站深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
1.初級寫法
package com.java4all.test6;
/**
* Author: yunqing
* Date: 2018/8/13
* Description:單例模式 -- 初級
*/
public class Singleton {
private static Singleton singleton = null;
public Singleton() {
}
/**并發下會產生多個實例*/
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}上面這種寫法,在并發環境下,會出現多個實例。
2.加鎖
我們優化上面的代碼,遇到并發,很容易想到加鎖,把獲取對象的方法加上關鍵字synchronized,很巧,這種寫法也稱為懶漢式單例 ,如下:
package com.java4all.test6;
/**
* Author: yunqing
* Date: 2018/8/13
* Description:
*/
public class BadSynchronizedSingleton {
private static BadSynchronizedSingleton synchronizedSingleton;
private BadSynchronizedSingleton() {
}
/**
* 缺點:等待時間長
* 這種整個方法都同步了,效率很低
* */
public synchronized static BadSynchronizedSingleton getInstance(){
if(synchronizedSingleton == null){
synchronizedSingleton = new BadSynchronizedSingleton();
}
return synchronizedSingleton;
}
}但是,顯然,我們把整個方法都同步了,效率很低下,我們可以繼續優化,只在創建實例的地方加上同步,參考5雙鎖檢驗。
3.餓漢式
餓漢式的特點是:類在加載時就直接初始化了實例。即使沒用到,也會實例化。
package com.java4all.test6;
/**
* Author: yunqing
* Date: 2018/8/13
* Description:餓漢式單例模式--類初始化時就自行實例化
*/
public class ESingleton {
/**類在加載的時候直接進行初始化*/
private static final ESingleton ESINGLETON = new ESingleton();
private ESingleton() {}
/**對外暴露唯一接口 提供單例對象*/
public static ESingleton geteSingleton(){
return ESINGLETON;
}
}4.懶漢式
懶漢式的特點是:用到這個實例時才去調用方法實例化。這個和2中的看起來是一樣的,因為這個實例化方法加了synchronized ,這樣安全一些。
package com.java4all.test6;
/**
* Author: yunqing
* Date: 2018/8/13
* Description:懶漢式單例模式
* 第一次調用時實例化
*/
public class BSingleton {
private static BSingleton bSingleton ;
private BSingleton() {
}
/**
* 整個方法鎖住了,效率較低
* @return
*/
public synchronized static BSingleton getbSingleton(){
if(bSingleton == null){
bSingleton = new BSingleton();
}
return bSingleton;
}
}5.雙鎖檢驗
雙重非空判斷,new對象前加一次鎖。
volatile關鍵字,考慮的是,new關鍵字在虛擬機中執行時其實分為很多步驟,具體原因可以參考深入理解java虛擬機一書(考慮的是這個new關鍵字字節碼執行時是非原子性的),而volatile關鍵字可以防止指令重排。
package com.java4all.test6;
/**
* Author: yunqing
* Date: 2018/8/13
* Description:雙鎖檢驗
*/
public class SynchronizedSingleton {
/**volatile防止指令重排*/
private static volatile SynchronizedSingleton singleton;
private SynchronizedSingleton() {
}
/**只是在實例為空時才進行同步創建
* 為什么做了2次判斷?
* A線程和B線程同時進入同步方法0
* 然后都在1位置處判斷了實例為null
* 然后都進入了同步塊2中
* 然后A線程優先進入了同步代碼塊2中(B線程也進入了),然后創建了實例
* 此時,如果沒有3處的判斷,那么A線程創建實例同時,B線程也會創建一個實例
* 所以,還需要做2次判斷
* */
public static SynchronizedSingleton getInstance(){//0
if(singleton == null){//1
synchronized (SynchronizedSingleton.class){//2
if(singleton == null){//3
singleton = new SynchronizedSingleton();//4
}
}
}
return singleton;
}
}6.內部類
package com.java4all.test6;
/**
* Author: yunqing
* Date: 2018/9/15
* Description:靜態內部類
* 優點:1.延遲,外部類初始化時不會進行實例創建,要用時才會創建
* 2.安全,靜態成員變量
*/
public class FSingleton {
private FSingleton() {
}
public static FSingleton getInstance(){
return Singleton.fSingleton;
}
private static class Singleton{
private static FSingleton fSingleton = new FSingleton();
}
}以上就是java中單例的優缺點有哪些,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創新互聯行業資訊頻道。
本文題目:java中單例的優缺點有哪些
文章來源:http://www.js-pz168.com/article32/jhjhpc.html
成都網站建設公司_創新互聯,為您提供網站建設、外貿建站、網站設計、網站改版、網站排名、小程序開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯