日期
2019-06-20 8:00 pm
问题
golang相关
问题1:golang中单例模式如何实现?
sync.once,简单实现如下:
var m *Manager
var once sync.Once
func GetInstance() *Manager {
once.Do(func() {
m = &Manager {}
})
return m
}
type Manager struct {}
func (p Manager) Manage() {
fmt.Println("manage...")
}
问题2: golang的once的实现机制
其实golang中once的实现及其简单,源码如下:
import (
"sync/atomic"
)
type Once struct {
m Mutex
done uint32
}
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 1 {
return
}
// Slow-path.
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
其中的构成是一个mutex互斥锁外加一个done的标记位
同时用atomic原子操作,保证了标志位设置过程的原子性
使用了双重检验的机制
关键点:once是线程安全的,并发安全
问题3: defer
- defer 在 return 之前执行
- defer 是 后进先出的顺序执行
redis相关
问题:redis中的并发读写如何实现?
- 首先redis服务端是单线程的,是串行处理业务端请求的
- 所以并发问题主要存在于业务端
- 建议使用**消息队列(chan)**的方式,将业务端的写操作也串行化
- 如果不使用消息队列的方式,就需要使用redis中incr,setnx命令,实现分布式锁, 这个分布式锁有官方实现的包,建议使用
逻辑思维相关
一根金条,一个长工,7天时间,每天给他1/7的工资;只能切这个金条两次:
- 切成 1 - 2 - 4 的比例
- 隐含条件是可以赎回,比如第二天的时候,可以将2/7给长工,然后把1/7拿回来
总体的表现不是很好,基本都没有答出来,需要后续补上对应的内容