about summary refs log tree commit diff
path: root/go/mutex.go
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-02-09T01·02+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-02-10T10·06+0000
commit2d3428c8096c27c0c499f0c89ef92b8c306b644e (patch)
tree219a212e751d9f6b38aeaa7f8519a5f03e07ccba /go/mutex.go
parent2af05f698c583bb71f318352e1da3b9ae2d1ae31 (diff)
Practice concurrency in golang
Uploading some snippets I created to help me better understand concurrency in
general and specifically concurrency in golang.
Diffstat (limited to 'go/mutex.go')
-rw-r--r--go/mutex.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/go/mutex.go b/go/mutex.go
new file mode 100644
index 000000000000..5cea20754bed
--- /dev/null
+++ b/go/mutex.go
@@ -0,0 +1,53 @@
+package main
+
+import (
+	"fmt"
+	"math/rand"
+	"sync"
+	"sync/atomic"
+	"time"
+)
+
+func main() {
+	state := make(map[int]int)
+	mux := &sync.Mutex{}
+
+	var readOps uint64
+	var writeOps uint64
+
+	// Read from state
+	for i := 0; i < 1000; i += 1 {
+		for j := 0; j < 100; j += 1 {
+			go func() {
+				key := rand.Intn(5)
+				mux.Lock()
+				fmt.Printf("state[%d] = %d\n", key, state[key])
+				mux.Unlock()
+				atomic.AddUint64(&readOps, 1)
+				time.Sleep(time.Millisecond)
+			}()
+		}
+	}
+
+	// Write to state
+	for i := 0; i < 10; i += 1 {
+		for j := 0; j < 100; j += 1 {
+			go func() {
+				key := rand.Intn(5)
+				mux.Lock()
+				state[key] += 1
+				mux.Unlock()
+				fmt.Printf("Wrote to state[%d].\n", key)
+				atomic.AddUint64(&writeOps, 1)
+				time.Sleep(time.Millisecond)
+			}()
+		}
+	}
+
+	time.Sleep(time.Millisecond)
+
+	mux.Lock()
+	fmt.Printf("State: %v\n", state)
+	mux.Unlock()
+	fmt.Printf("Reads: %d\tWrites: %d\n", atomic.LoadUint64(&readOps), atomic.LoadUint64(&writeOps))
+}