單例模式:保證獲取到的物件是同乙個物件,物件只例項化一次
特點:單例類的構造方法是private
有乙個靜態方法getinstance獲取單例例項
兩大類:懶漢式與餓漢式
懶漢:在需要單例物件時,手動呼叫getinstance方法時,才會執行第一次建立
餓漢:預設就建立好乙個單例物件,不需要手動呼叫才建立
/**
* 懶漢模式----在工廠方法中例項化
* 單例例項在第一次使用時進行建立
*/@slf4j
@notrecommend
@notthreadsafe
public class singletonexample1
private static singletonexample1 instance=null;
public static singletonexample1 getinstance()
}
使用synchronized關鍵字修飾getinstance方法,保證每次只能乙個執行緒呼叫該方法,保證了執行緒安全
但是,不推薦,效率比較低,因為單例只例項化一次,也就是說99.999999%的情況下,getinstance返回的是已經初始化的同乙個物件
/**
* 懶漢模式
* 單例例項在第一次使用時進行建立
*/@slf4j
@threadsafe
@notrecommend
public class singletonexample3
private static singletonexample3 instance=null;
// 使用synchronized修飾,同一時間只能有乙個執行緒進入這個方法,
// 是執行緒安全的,但是會導致效率低下
public static synchronized singletonexample3 getinstance()
}
/**
* 懶漢模式
* 單例例項在第一次使用時進行建立
* 雙重檢測機制:執行緒安全問題?如何限制指令重排呢?
*/@slf4j
@notthreadsafe
public class singletonexample4
// 1, memory=allocate()分配物件的記憶體空間
// 2,ctorinstance()初始化物件
// 3,instance=memory 設定instance指向剛分配的記憶體
// jvm和cpu優化,發生指令重排
// 1, memory=allocate()分配物件的記憶體空間
// 3,instance=memory 設定instance指向剛分配的記憶體
// 2,ctorinstance()初始化物件
private static singletonexample4 instance=null;
public static singletonexample4 getinstance()}}
return instance;
}}
效能較高
/**
* 懶漢模式
* 單例例項在第一次使用時進行建立
* 雙重檢測機制:執行緒安全問題?如何限制指令重排呢? 使用volatile+雙重檢測機制
*/@slf4j
@threadsafe
public class singletonexample5
// 1, memory=allocate()分配物件的記憶體空間
// 2,ctorinstance()初始化物件
// 3,instance=memory 設定instance指向剛分配的記憶體
//單例物件 volatile+雙重檢測機制-》禁止指令重排
// 被volatile關鍵字修飾的物件或者變數,對其讀寫的操作時直接在主存中執行的,也就是
//獲取最新的值,新的值也能立刻更新到主存中
private static volatile singletonexample5 instance=null;
public static singletonexample5 getinstance()中
if(null==instance)}}
return instance;
}}
餓漢模式**示例
/**
* 餓漢模式
* 單例例項在類裝載使用時進行建立
* 要求:該單例物件一定會被使用,以免造成資源浪費
*/@slf4j
@threadsafe
public class singletonexample2
private static singletonexample2 instance=new singletonexample2();
public static singletonexample2 getinstance()
}
**
* 餓漢模式--使用靜態塊例項化
* 單例例項在類裝載使用時進行建立
* 要求:該單例物件一定會被被使用,以免造成資源浪費
* 初始化順序:這個順序不必記憶,具體可打斷點觀察順序
*/@slf4j
@threadsafe
public class singletonexample6
// static
private static singletonexample6 instance=null;
static
public static singletonexample6 getinstance()
public static void main(string args)
}
使用列舉來完成單例的例項化,推薦,這是由jvm保證的
/**
* 餓漢模式--使用列舉例項化,最安全
* 單例例項在類裝載使用時進行建立
* 要求:該單例物件一定會被被使用,以免造成資源浪費
*/@slf4j
@threadsafe
@recommend
public class singletonexample7
private static singletonexample7 instance=null;
public static singletonexample7 getinstance()
//列舉是特殊的類,這裡將其看成是乙個內部類即可
private enum singleton
public singletonexample7 getsingleton()
}public static void main(string args)
}
@threadsafe
@notthreadsafe
@recommend
@notrecommend
是自定義註解,只是用來方便標識類(方法)是否執行緒安全,是否推薦等資訊
註解類**如下:
/**
* 標識不推薦的寫法
*/@target(elementtype.type)
@retention(retentionpolicy.source)
public @inte***ce notrecommend
/**
* 用來標記執行緒【不安全】的類或者方法
*/@target(elementtype.type)
//註解範圍
@retention(retentionpolicy.source)
public @inte***ce notthreadsafe
/**
* 標識推薦的寫法
*/@target(elementtype.type)
@retention(retentionpolicy.source)
public @inte***ce recommend
/**
* 用來標記執行緒安全的類或者方法
*/@target(elementtype.type)
//註解範圍
@retention(retentionpolicy.source)
public @inte***ce threadsafe
多執行緒 三 安全發布物件和單例模式舉例
發布物件 使乙個物件能夠被當前範圍之外的 所使用 物件逸出 一種錯誤的發布.當乙個物件還沒有構造完成時,就使它被其它執行緒所見.安全發布物件4種方法 1.在靜態初始化函式中初始化乙個物件引用.2.將物件的引用儲存到volatile型別域或者atomicreference物件中.3.將物件的引用儲存到...
c 多執行緒單例模式 執行緒安全C 單例模式
我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...
設計模式 單例模式(執行緒安全)
前言 單例模式是設計模式中比較簡單的一種,但是又因為簡單常見在面試中又是經常出現的乙個設計模式。所以必須要會啊。之前也只是會寫執行緒不安全的單例模式。單例模式 乙個類能返回物件乙個引用 永遠是同乙個 和乙個獲得該例項的方法 必須是靜態方法,通常使用getinstance這個名稱 當我們呼叫這個方法時...