1
0
mirror of https://github.com/charlienet/go-mixed.git synced 2026-07-14 08:17:26 +08:00

fix: 修复多处并发安全问题及锁实现重构

locker: 导出 RWLocker/EmptyLocker 接口, 新增 WithRWLocker, 重构
  SourceLocker 竞态、Synchronize 数据竞态

collections/linked_list: 补齐 ForEach/Size/GetAt/RemoveAt/ToList
  等方法的锁保护
collections/queue,stack: Peek/Size/IsEmpty 加锁
collections/list/linked_list: Front/Back/GetAt 加锁
maps: rwlock_map.Exist/Count, hash_map.Count 加锁
delay_queue/mem_store: Pop 原子化、Len/IsEmpty 加锁
cleanup_guard: Run() 检查 enable 标志
sets/ketama: 修复接口变更导致的 nil 空指针
This commit is contained in:
Charlie
2026-06-05 10:45:08 +08:00
parent b14262e9eb
commit c44a325384
17 changed files with 178 additions and 82 deletions
+43 -15
View File
@@ -95,20 +95,22 @@ func (l *LinkedList[T]) PushTail() {
}
func (l *LinkedList[T]) Exist(v T) bool {
ret := false
l.ForEach(func(t T) bool {
// if t == v {
// ret = true
// return true
// }
l.mu.RLock()
defer l.mu.RUnlock()
return false
})
for current := l.head; current != nil; current = current.next {
if any(current.item) == any(v) {
return true
}
}
return ret
return false
}
func (l *LinkedList[T]) RemoveAt(index int) {
l.mu.Lock()
defer l.mu.Unlock()
var i int
var prev *linkedNode[T]
@@ -130,15 +132,22 @@ func (l *LinkedList[T]) RemoveAt(index int) {
}
func (l *LinkedList[T]) IsEmpty() bool {
l.mu.RLock()
defer l.mu.RUnlock()
return l.size == 0
}
func (l *LinkedList[T]) Size() int {
l.mu.RLock()
defer l.mu.RUnlock()
return l.size
}
func (l *LinkedList[T]) GetAt(i int) T {
if i <= l.Size() {
l.mu.RLock()
defer l.mu.RUnlock()
if i < l.size {
var n int
for current := l.head; current != nil; current = current.next {
if n == i {
@@ -152,6 +161,9 @@ func (l *LinkedList[T]) GetAt(i int) T {
}
func (l *LinkedList[T]) ForEach(fn func(T) bool) {
l.mu.RLock()
defer l.mu.RUnlock()
for current := l.head; current != nil; current = current.next {
if fn(current.item) {
break
@@ -160,26 +172,42 @@ func (l *LinkedList[T]) ForEach(fn func(T) bool) {
}
func (l *LinkedList[T]) Clear() {
l.mu.Lock()
defer l.mu.Unlock()
l.head = nil
l.tail = nil
l.size = 0
}
func (l *LinkedList[T]) ToList() []T {
l.mu.RLock()
defer l.mu.RUnlock()
ret := make([]T, 0, l.size)
l.ForEach(func(t T) bool {
ret = append(ret, t)
return false
})
for current := l.head; current != nil; current = current.next {
ret = append(ret, current.item)
}
return ret
}
func (l *LinkedList[T]) String() string {
return fmt.Sprint(l.ToList())
l.mu.RLock()
defer l.mu.RUnlock()
ret := make([]T, 0, l.size)
for current := l.head; current != nil; current = current.next {
ret = append(ret, current.item)
}
return fmt.Sprint(ret)
}
func (l *LinkedList[T]) remove(n *linkedNode[T]) {
l.mu.Lock()
defer l.mu.Unlock()
n.next = nil
l.size--
}