单例对象的类必须保证只有一个实例存在,全局有唯一接口访问。

分类

  • 懒汉模式:指全局的单例实例在第一次呗使用时构建
  • 饿汉模式:指全局的单例在类装载时构建

实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package main

import (
	"sync"
)

type singleton struct{}

//1.懒汉方式--不能并发
var ins1 *singleton

func getInstance1() *singleton {
	if ins1 == nil {
		ins1 = &singleton{}
	}
	return ins1
}

//2.饿汉方式--初始化消耗大
var ins2 *singleton = &singleton{}

func getInstance2() *singleton {
	return ins2
}

//3.懒汉加锁--解决并发,加锁代价高
var ins3 *singleton
var mu sync.Mutex

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

	if ins3 == nil {
		ins3 = &singleton{}
	}
	return ins3
}

//4.加锁前判断两次--避免加锁,提高效率
var ins4 *singleton
var mu4 sync.Mutex

func getInstance4() *singleton {
	if ins4 == nil {
		mu.Lock()
		defer mu.Unlock()

		if ins4 == nil {
			ins4 = &singleton{}
		}
	}
	return ins4
}

//sync.Once实现
var ins5 *singleton
var once sync.Once

func getInstance5() *singleton {
	once.Do(func() {
		ins5 = &singleton{}
	})
	return ins5
}