golang mysql单例模式_Golang设计模式——单例模式

要点:sync.Once 的应用

高并发场景下读写锁

package singleton

import "sync"

var  (

p *Pet

once sync.Once

)

func init(){

once.Do(

func() {

p = &Pet{}

})

}

func GetInstance() *Pet{

return p

}

type Pet struct {

Name string

Age int

m sync.Mutex

}

func (p *Pet)GetName()string{

return p.Name

}

func (p *Pet) GetAge() int{

return p.Age

}

func(p *Pet) SetName(name string) {

p.m.Lock()

defer p.m.Unlock()

p.Name = name

}

func(p *Pet) IncAge() {

p.m.Lock()

defer p.m.Unlock()

p.Age++

}

测试用例package singleton

import "testing"

func TestGetInstance(t *testing.T) {

p := GetInstance()

p.SetName("tommy")

p.IncAge()

p.GetName()

p.GetAge()

}

测试并发场景func IncAgeTest1(){

p = GetInstance()

p.IncAge()

}

func IncAgeTest2(){

p = GetInstance()

p.IncAge()

}package singleton

import (

"fmt"

"sync"

"testing"

)

func TestGetInstance(t *testing.T) {

wg := sync.WaitGroup{}

wg.Add(200)

for i:=0;i<100;i++{

go func() {

defer wg.Done()

IncAgeTest1()

}()

go func() {

defer wg.Done()

IncAgeTest2()

}()

}

wg.Wait()

p := GetInstance()

fmt.Println(p.Age)

}// output

=== RUN   TestGetInstance

200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值