• lJ
    2024-12-23 来自江苏
    1. LockFreeCache虽然 atomic.Value 可以确保对整个 map 的原子性更新,但好像依然存在读写冲突问题。例如,在 Get 方法中读取了 map 的指针后,对 map 的内容操作是非原子的。如果此时另一个协程调用 Update 替换了整个 map,那么读取就可能是过时的数据了吧。如果再加互斥锁,那么还不如基于RWMutexCache实现呢。另外,调用 Update 方法时,新的 map 被存储在 atomic.Value 中,而旧的 map 仍然在内存中,会导致内存泄漏的吧。 2. 这种无所编程实现的map其对应的benchmark测试,性能如何 3. 面试中遇到过问基于channel实现的并发安全map,这个实现适用的场景是啥,是否有可替换的方法呢? 4. 思考题 type StackNode struct { value interface{} next *StackNode } type LockFreeStack struct { head unsafe.Pointer // 栈顶节点 } func NewLockFreeStack() *LockFreeStack { return &LockFreeStack{} } func (s *LockFreeStack) Push(value interface{}) { newNode := &StackNode{value: value} for { currentHead := (*StackNode)(atomic.LoadPointer(&s.head)) newNode.next = currentHead if atomic.CompareAndSwapPointer(&s.head, unsafe.Pointer(currentHead), unsafe.Pointer(newNode)) { return } } } func (s *LockFreeStack) Pop() (interface{}, bool) { for { currentHead := (*StackNode)(atomic.LoadPointer(&s.head)) if currentHead == nil { return nil, false } if atomic.CompareAndSwapPointer(&s.head, unsafe.Pointer(currentHead), unsafe.Pointer(currentHead.next)) { return currentHead.value, true } } }
    展开
    
    