go原子操作

package main

import (
	"log"
	"strconv"
	"sync/atomic"
	"testing"
	"time"
)

func Test_atomic(*testing.T) {
	var s atomic.Value
	mp := map[string]string{}
	// 设置value值
	s.Store(mp)
	// var m sync.Mutex
	insert := func(key string, value string) {
		//m.Lock()
		//defer m.Unlock()
		s1 := s.Load().(map[string]string)
		// s1 := mp
		s2 := map[string]string{}
		for k, v := range s1 {
			s2[k] = v
		}
		s2[key] = value
		// mp[key] = value
		s.Store(s2)
	}
	for i := 0; i < 10; i++ {
		go func(i int) {
			// fatal error: concurrent map iteration and map write
			// m.Lock()
			insert(strconv.Itoa(i), strconv.Itoa(i))
			// defer m.Unlock()
		}(i)
	}
	time.Sleep(8 * time.Second)
	log.Println("map----->", s)

	read := func(key string) string {
		// Load返回最近的Store设置的值
		// 类型断言
		ss := s.Load().(map[string]string)
		return ss[key]
		// return mp[key]
	}
	for i := 0; i < 10; i++ {
		go func(i int) {
			cc := read(strconv.Itoa(i))
			log.Println("read  --->", cc)
		}(i)
	}
	time.Sleep(5 * time.Second)
}

你可能感兴趣的:(golang)