多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] > https://mp.weixin.qq.com/s/kWpQSJNWoOqV64Ol1sIeow ## 概述 ``` // 栈元素节点 type directItem struct { next unsafe.Pointer v interface{} } // CAS 操作实现的栈 (无锁编程) type LockFreeStack struct { // 栈元素容器用链表表示 top unsafe.Pointer // 栈长度 len uint64 } func NewLockFreeStack() *LockFreeStack { return &LockFreeStack{} } func (s *LockFreeStack) Push(v interface{}) { item := directItem{v: v} var top unsafe.Pointer for { top = atomic.LoadPointer(&s.top) item.next = top if atomic.CompareAndSwapPointer(&s.top, top, unsafe.Pointer(&item)) { // 只有 1 个 goroutine 可以执行到这里 // 栈元素数量 + 1 atomic.AddUint64(&s.len, 1) return } } } func (s *LockFreeStack) Pop() interface{} { var top, next unsafe.Pointer var item *directItem for { top = atomic.LoadPointer(&s.top) if top == nil { return nil } item = (*directItem)(top) next = atomic.LoadPointer(&item.next) if atomic.CompareAndSwapPointer(&s.top, top, next) { // 只有 1 个 goroutine 可以执行到这里 // 栈元素数量 - 1 atomic.AddUint64(&s.len, ^uint64(0)) return item.v } } } ```