面试之路2019 - 01

日期

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中的并发读写如何实现?

  1. 首先redis服务端是单线程的,是串行处理业务端请求的
  2. 所以并发问题主要存在于业务端
  3. 建议使用**消息队列(chan)**的方式,将业务端的写操作也串行化
  4. 如果不使用消息队列的方式,就需要使用redis中incr,setnx命令,实现分布式锁, 这个分布式锁有官方实现的包,建议使用

逻辑思维相关

一根金条,一个长工,7天时间,每天给他1/7的工资;只能切这个金条两次:

  1. 切成 1 - 2 - 4 的比例
  2. 隐含条件是可以赎回,比如第二天的时候,可以将2/7给长工,然后把1/7拿回来

总体的表现不是很好,基本都没有答出来,需要后续补上对应的内容

你可能感兴趣的:(面试之路2019,面试问题)