本篇文章給大家分享的是有關(guān)java中單例的優(yōu)缺點(diǎn)有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

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