45. sync.Mutex 배제 및 배제 잠금
c.mux.Lock()
c.v[key]++ //Lock , goroutine c.v
c.mux.Unlock()
defer 문구로 상호 배척 자물쇠가 반드시 잠금 해제될 것을 보장할 수도 있다.
c.mux.Lock()
defer c.mux.Unlock()
코드 예시를 만들고 계수기 구조체를 만듭니다
// , sync.Mutex
type SafeCounter struct {
v map[string]int
mux sync.Mutex
}
v는 계수기 맵에 sync를 추가합니다.Mutex 유형SafeCounter에 두 가지 방법을 추가합니다. 하나는 inc로 계수기 값을 누적하고, 하나는Value로 현재 계수기 값을 가져옵니다.
// key
func (c *SafeCounter) Inc(key string) {
c.mux.Lock()
//Lock , goroutine c.v
c.v[key]++
c.mux.Unlock()
}
//
func (c *SafeCounter) Value(key string) int {
c.mux.Lock()
defer c.mux.Unlock()
return c.v[key]
}
주 함수는 100번 순환하고, 고루틴을 사용하여 계수기를 증가시킵니다.그리고 현재 계수기의 값을 얻습니다.너무 빨리 실행되어 효과가 보이지 않도록 매번 순환은 100밀리초 간격으로 해야 한다.
time.Sleep(100*time.Millisecond)
전체 코드 예
package main
import (
"sync"
"fmt"
"time"
)
// , sync.Mutex
type SafeCounter struct {
v map[string]int
mux sync.Mutex
}
// key
func (c *SafeCounter) Inc(key string) {
c.mux.Lock()
//Lock , goroutine c.v
c.v[key]++
c.mux.Unlock()
}
//
func (c *SafeCounter) Value(key string) int {
c.mux.Lock()
defer c.mux.Unlock()
return c.v[key]
}
func main() {
c := SafeCounter{v:make(map[string]int)}
for i := 0; i < 100; i++{
go c.Inc("somekey")
time.Sleep(100*time.Millisecond)
fmt.Println(c.Value("somekey"))
}
fmt.Println(c.Value("somekey"))
}
실행 결과가 너무 길어서 전시를 하지 않습니다.스스로 실천하세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.