1. 程式人生 > >Go 單例模式

Go 單例模式

    單例模式,是一種常用的軟體設計模式,在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以包在系統中一個類只有一個例項且該例項易於訪問,從而方便對例項個數的控制並節約系統資源。

懶漢模式(Lazy Loading)

   懶漢模式是開源專案中使用最多的一種,最大的缺點是非執行緒安全的。

type singleton struct {
}

// private
var instance *singleton

// public
func GetInstance() *singleton {
    if instance == nil {
        instance = &singleton{}     // not thread safe
    }
    return instance
}
帶鎖的單例模式
type singleton struct {
}

var instance *singleton
var mu sync.Mutex

func GetInstance() *singleton {
    mu.Lock()
    defer mu.Unlock()

    if instance == nil {
        instance = &singleton{}     // unnecessary locking if instance already created
    }
    return instance
}

帶檢查鎖的單例模式

if instance == nil {     // <-- Not yet perfect. since it's not fully atomic
        mu.Lock()
        defer mu.Unlock()
 
        if instance == nil {
            instance = &singleton{}
        }
    }
    return instance
}

import "sync"
import "sync/atomic"

var initialized uint32
...

func GetInstance() *singleton {

    if atomic.LoadUInt32(&initialized) == 1 {
        return instance
    }

    mu.Lock()
    defer mu.Unlock()

    if initialized == 0 {
         instance = &singleton{}
         atomic.StoreUint32(&initialized, 1)
    }

    return instance
}


比較好的一種方式sync.Once

import (
    "sync"
)
 
type singleton struct {
}
 
var instance *singleton
var once sync.Once
 
func GetInstance() *singleton {
    once.Do(func() {
        instance = &singleton{}
    })
    return instance
}


相關推薦

Go 模式

    單例模式,是一種常用的軟體設計模式,在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以包在系統中一個類只有一個例項且該例項易於訪問,從而方便對例項個數的控制並節約系統資源。 懶漢

Go語言中的模式

syn main 單例模式 return and type KS int pack 單例模式 使用單例的目的是為了保證在整個系統中存在唯一的實例 package main import ( "fmt" "sync" ) type IntA

go 設計模式(一)模式

go 的單例模式寫法比較簡單,可以通過sync.Once來輔助。 type Singleton struct { name string } var ( once sync.Once instance *Singleton ) func New()

設計模式-模式(Go語言描述)

這篇部落格我們繼續來看設計模式,今天帶來的是一個最簡單而且最常用的模式-單例模式。那什麼是單例模式呢?相信大家最它最熟悉不過了,那我們就來快速的瞭解一下它的定義。 保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 這個解釋足夠簡單。說白了就是

go語言模式(Singleton)例項分析

本文例項講述了go語言單例模式(Singleton)用法。分享給大家供大家參考。具體分析如下:單例模式(Singleton):表示一個類只會生成唯一的一個物件。單例模式具有如下性質:A.這些類只能有一個例項;B.這些能夠自動例項化;C.這個類對整個系統可見,即必須向整個系統提

模式

實現 程序 先來 null effective 如果 ava 不同的 aps 單例模式:確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 優點: 1、省略創建對象所花費的時間減少系統開銷,尤其是重量級對象。 2、減少對象的創建,減輕GC壓力。 3、設置全局

GOF23—模式(2)

應該 一個 img bsp 漏洞 資源 nbsp 創建 就會 本文介紹單例模式(不包含枚舉單例模式)漏洞問題以及如何防止漏洞   1.反射可以破解單例模式,例子如下:       此時,我們運行Client類,發現s1和s2是一個對象,但s3和s4是不同的對象。 那麽如何防

溫故而知新(java實現)模式的七種寫法

反序 防止 代碼 工作 html 我想 變種 evel 才會 第一種(懶漢,線程不安全): Java代碼 public class Singleton { private static Singleton instance; private S

模式和線程安全

tac 可能 存在 版本 線程不安全 廣東 多線程 一個 單例 前幾天給項目的省市區加了redis。結果上線沒多久就發生了數據錯亂的現象,需要讀取山東省的市可能返回的市廣東的。一開始不明白哪裏有問題,因為測試組的同學有測試過,在測試過程種並沒有發生這樣的情況。由於使用了se

C#模式的多種寫法

code if語句 規則 最簡 lock 實現 readonly led 三種 它的主要特點不是根據客戶程序調用生成一個新的實例,而是控制某個類型的實例數量-唯一一個。(《設計模式-基於C#的工程化實現及擴展》,王翔)。也就是說,單例模式就是保證在整個應用程序的生命周期中,

Swift、Objective-C 模式 (Singleton)

app 賦值 uil imp ide 效果 func instance 發現 本文的單例模式分為嚴格單例模式和不嚴格單例模式。單例模式要求一個類有一個實例,有公開接口可以訪問這個實例。嚴格單例模式,要求一個類只有一個實例;不嚴格單例模式,可以創建多個實例。 有的類只能有一個

模式-Singleton

加載 null 允許 nbsp 訪問 加載類 public tin style 單例模式:保證一個類僅有一個實例,並提一個訪問它的全局訪問點。   通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止你實例化多個對象。一個最好的辦法就是,讓類自身負責保存它的唯一實例。

[轉]設計模式--模式(一)懶漢式和餓漢式

打印 是否 調用構造 餓漢 一段 tools 會有 輸出結果 java 單例模式是設計模式中比較簡單的一種。適合於一個類只有一個實例的情況,比如窗口管理器,打印緩沖池和文件系統, 它們都是原型的例子。典型的情況是,那些對象的類型被遍及一個軟件系統的不同對象訪問,因此需要一個

23種設計模式介紹以及模式的學習

單例模式 餓漢式 23種設計模式 gof23 1、GOF23 設計模式總共分成創建型模式、結構型模式和行為型模式三種: a、創建型模式: - 單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式 b、構建型模式: - 適配器模式、橋接模式、裝配模式、組合模式、建造者模

c++之模式

lsi 但是 desc 模式 單例模式 ron spl 希望 構造函數 1 本篇主要討論下多線程下的單例模式實現:   首先是 double check 實現方式: 這種模式可以滿足多線程環境下,只產生一個實例。 template<typename T>

面向對象編程思想-模式

構造 turn 什麽 性能 線程池 線程並發 管理器 成員 man 單例模式的定義:只能有一個實例,提供唯一公開、可訪問實例的全局訪問點 單例模式的三種實現方式: 示例1      private Singleton() {

模式(Singleton)

ech 單例模式 bsp 在線 創建 private 解決 餓漢式 dir 1.解決的問題:使得一個類只能夠創建一個對象。2.如何實現: ①私有化構造器,使得在類的外部不能調用該構造器 ②在類的內部創建一個實例 ③私有化該對象,通過公共的方法來調用(返回該

快速理解Java中的五種模式

嵌套類 ati class 由於 aop 適合 singleton 重復 code 解法一:只適合單線程環境(不好) package test; /** * @author xiaoping * */ public class Singleton { pri

javascript設計模式-模式

空間 spa 靜態變量 通過 script 無法 單例 onf 訪問 單例模式,是創建型設計模式的一種,又被稱為單體模式,是只允許實例化一次的對象類。有時也用來規劃一個命名空間。 1 var Util = { 2 getName: function () {

設計模式模式的三種創建方式及其各自的優缺點

singleton dmi 創建 檢查 public pos return style tin 單例模式: 確保一個類僅僅有一個實例,並提供全局訪問點。在Java中實現單例模式須要私有的構造器,一個靜態方法和一個靜態變量。確定在性能和資源上 的限制,怎樣選擇適當的方案來