1樓:rail gun
效能問題,如果按照題主這樣寫,每次都要進入同步狀態。而如果在之前加乙個判斷的話,那麼大部分不為null的情況就不用被同步了提高效率
2樓:朱涵俊
這個同步只有建立的時候需要,避免建立多個例項。而建立只需要一次,大部分時候只需要獲取已經建立的例項,就是說已經建立之後就不需要同步了。因此在同步外有個判斷,如果有例項了直接返回,不需要同步操作,這樣避免了大部分同步操作,提高效能。
這個不像讀寫同步,每次都需要同步。
3樓:風清陽
外部判斷是為了盡量少用鎖,提高效能。內部判斷是為了避免多執行緒解鎖後重複建立物件。
這種寫法的單例變數需要是volatile,並且jdk1.5之後才可行,因為jdk1.5之後volaile能防止記憶體重排序引起問題。
我還是推薦類載入的寫法以及單例的寫法,好記好用。
4樓:空指標
早已採用靜態內部類方式寫,配置了模板,ins+enter直接出來,23333
private static class SingleInstance
private HomeActivity (){}public static HomeActivity getInstance()
5樓:Tinys
--首先這種方式不被推薦..
如果要用..請先宣告變數為volatile確保可見性..
--然後普通情況下變數宣告的時候new是沒問題的...
--最後單例最好的應該是使用類載入機智確保單例的那種實現方式最穩妥吧...
6樓:
補充一點,雙重檢查要配合volatile關鍵字使用(jdk1.5及以上)
public
class
Singleton
private
static
volatile
Singleton
singleton
;public
static
Singleton
getInstance()}
}return
singleton;}}
7樓:Goorwl
這是單例標準寫法。
要看這道題就要參考單例設計模式的要求了。
這樣寫主要是避免多執行緒訪問可能出現的併發問題,從而破壞單例規則。具體原因:當1外迴圈判斷以後,CPU執行權被2拿到了,此時2判斷為空也成立,所以就會造成單例的失敗。
如果加上雙層判斷,在同步鎖內再判斷就會保證單例的絕對安全。
8樓:Davidsun
Lock 有不同的實現方法,原文中提到的實現兼顧了 Lock 的功能和效率。詳見:Double-checked locking,我就不再贅述了。
9樓:
單例模式只生成乙個物件的技巧,據說被廢棄不推薦使用了。可以考慮呼叫內部類static class 時只生成一次物件的方式。
public class Test {
private static class SingletonHolder {
private static final Test INSTANCE = new Test();
private Test() {
public static final Test getInstance() {
return SingletonHolder.INSTANCE;
10樓:junhua xu
雙檢鎖單例
同步鎖外判斷,為避免在例項已經建立的情況下每次獲取例項都加鎖取,影響效能;
鎖內判斷,考慮多執行緒情況下,兩個以上執行緒都已經執行至同步鎖處,也就是都已經判斷變數為空,如鎖內不再次判斷,會導致例項重複建立
Java 兩次 contains 方法的返回為什麼不一樣?
char a new char 1010 這句話是有初始化的,會把每乙個a i 都賦初始化的值,int 初始化0 boolean 初始化false char 初始化 u0000 就是空格 Object 初始化 null 後面的迴圈只是將前四個重新賦值為0了,後面還有很多的空格你看下 System.o...
在晉江寫文被殺5次,這篇又被殺兩次,有沒有大佬幫我看看是什麼原因?在這裡先謝謝各位大佬了(鞠躬) ?
初心不負 大概讀了一點,唯一的感受就是條理不夠清晰,你一直在想著拋笑料和賣點,但是沒有抓住主次,沒有將讀者視線聚集在讀者感興趣的地方。比如任務那裡寫的太發散了,讀起來很彆扭,這是讀者最關心的地方,你卻寫的很繞口。直接 她的任務 將未來會黑化的男主帶回正途,這是你想寫的 她也不明白系統為啥非要把這麼流...
為什麼德國在兩次世界大戰中都是反派?
空軍決勝者 一戰是列強爭奪世界霸權,無正邪之分。好像後世提到一戰也沒怎麼把德國當反派。二戰雖然軸心國有不少罪惡 蘇聯比他們只多不少 但這並不是它們被當做反派的原因。被當做反派,只是因為戰敗了。科幻大劇 高堡奇人 展示了世界的另一種可能,軸心國勝利,德國和日本平分美國。 如果沒有希特拉的種族滅絕問題,...