Skip to content

Commit b678263

Browse files
committed
mutex add
1 parent dad6823 commit b678263

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

sets/hast_set.go

+23-6
Original file line numberDiff line numberDiff line change
@@ -16,49 +16,64 @@ package sets
1616
import (
1717
"bytes"
1818
"fmt"
19+
"sync"
1920
)
2021

2122
type HashSet struct {
22-
m map[interface{}]bool
23+
m map[interface{}]bool
24+
lock *sync.Mutex
2325
}
2426

2527
func NewHashSet() *HashSet {
2628
return &HashSet{
27-
m: make(map[interface{}]bool),
29+
m: make(map[interface{}]bool),
30+
lock: &sync.Mutex{},
2831
}
2932
}
3033

3134
func (set *HashSet) Add(elements ...interface{}) {
35+
set.lock.Lock()
3236
for _, e := range elements {
3337
if !set.m[e] {
3438
set.m[e] = true
3539
}
3640
}
41+
set.lock.Unlock()
3742
}
3843

3944
func (set *HashSet) Remove(elements ...interface{}) {
45+
set.lock.Lock()
4046
for _, e := range elements {
4147
delete(set.m, e)
4248
}
49+
set.lock.Unlock()
4350
}
4451

4552
// whether all the elements are in the set
4653
// return true if all in, or false
4754
func (set *HashSet) Contains(elements ...interface{}) bool {
55+
set.lock.Lock()
4856
for _, e := range elements {
4957
if !set.m[e] {
58+
set.lock.Unlock()
5059
return false
5160
}
5261
}
62+
set.lock.Unlock()
5363
return true
5464
}
5565

5666
func (set *HashSet) Clear() {
67+
set.lock.Lock()
5768
set.m = make(map[interface{}]bool)
69+
set.lock.Unlock()
5870
}
5971

6072
func (set *HashSet) Len() int {
61-
return len(set.m)
73+
set.lock.Lock()
74+
len := len(set.m)
75+
set.lock.Unlock()
76+
return len
6277
}
6378

6479
func (set *HashSet) Empty() bool {
@@ -75,26 +90,28 @@ func (set *HashSet) Same(other Set) bool {
7590

7691
func (set *HashSet) Elements() []interface{} {
7792
snapshot := make([]interface{}, 0)
93+
set.lock.Lock()
7894
for key := range set.m {
7995
snapshot = append(snapshot, key)
8096
}
97+
set.lock.Unlock()
8198

8299
return snapshot
83100
}
84101

85102
func (set *HashSet) String() string {
86103
var buf bytes.Buffer
87-
buf.WriteString("HashSet{")
104+
buf.WriteString("HashSet{ ")
88105
first := true
89-
for key := range set.m {
106+
for _, key := range set.Elements() {
90107
if first {
91108
first = false
92109
} else {
93110
buf.WriteString(" ")
94111
}
95112
buf.WriteString(fmt.Sprintf("%v", key))
96113
}
97-
buf.WriteString("}")
114+
buf.WriteString(" }")
98115

99116
return buf.String()
100117
}

0 commit comments

Comments
 (0)