Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3f94ec0

Browse files
20220417
1 parent dfddba5 commit 3f94ec0

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

‎go-27/once_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package go_27
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
"testing"
7+
"unsafe"
8+
)
9+
10+
/*
11+
其实就是java里面的单例模式,一样理解即可
12+
go语言里面有个once方法只会执行一次,使用这个实现线程安全的懒汉单例模式
13+
*/
14+
15+
type Singleton struct {
16+
data string
17+
}
18+
19+
var sigleInstance *Singleton
20+
var once sync.Once
21+
22+
func GetSingletonObj() *Singleton {
23+
24+
//这个方法只会执行一次,不需要像java一样非空判断,第一次是肯定会创建对象的,且只会执行一次
25+
once.Do(func() {
26+
fmt.Println("Create Obj")
27+
sigleInstance = new(Singleton)
28+
})
29+
return sigleInstance
30+
}
31+
32+
func TestGetSingletonObj(t *testing.T) {
33+
var wg sync.WaitGroup
34+
for i := 0; i < 10; i++ {
35+
wg.Add(1)
36+
go func() {
37+
obj := GetSingletonObj()
38+
fmt.Printf("对象引用地址:%X\n", unsafe.Pointer(obj))
39+
wg.Done()
40+
}()
41+
}
42+
wg.Wait()
43+
}
44+
45+
/*
46+
运行结果:可以看到对象只创建了一次,后面都是获取的同一个对象引用,与java单例模式一样理解即可
47+
=== RUN TestGetSingletonObj
48+
Create Obj
49+
对象引用地址:C000030010
50+
对象引用地址:C000030010
51+
对象引用地址:C000030010
52+
对象引用地址:C000030010
53+
对象引用地址:C000030010
54+
对象引用地址:C000030010
55+
对象引用地址:C000030010
56+
对象引用地址:C000030010
57+
对象引用地址:C000030010
58+
对象引用地址:C000030010
59+
--- PASS: TestGetSingletonObj (0.00s)
60+
PASS
61+
*/

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /