Quick actions

cmd+k|ctrl+k

Navigation

Languages

LockFreeMap

Snippet info

Language

Go

Visibility

public

Author

cheshirysh

Created

2018-07-04T22:32:48Z

Updated

2018-07-04T22:33:10Z

package main

import (
	"sync/atomic"
	"unsafe"
)

func newLockFreeCache() lockFreeCache {
	ptr := unsafe.Pointer(new(map[string]string))
	cache := lockFreeCache{
		ptr: &ptr,
	}

	return cache
}

type lockFreeCache struct {
	ptr *unsafe.Pointer
}

func (cache lockFreeCache) read(key string) (string, bool) {
	v := (*map[string]string)(atomic.LoadPointer(cache.ptr))
	value, ok := (*v)[key]

	return value, ok
}

func (cache lockFreeCache) write(key, value string) {
	v := (*map[string]string)(atomic.LoadPointer(cache.ptr))

	nm := make(map[string]string)

	for k, v := range *v {
		nm[k] = v
	}
	nm[key] = value

	nmptr := unsafe.Pointer(&nm)
	atomic.StorePointer(cache.ptr, nmptr)

}

func main() {
	cache := newLockFreeCache()
	cache.write("key", "YEAH~!")
	val, _ := cache.read("key")
	println(val)
}
INFO