1

MyStructマップを含む構造体があります。同時読み取りと書き込みに対してマップへのアクセスを安全にしたいのですが、ベースに固執しMapsync.Map.

このためMyStruct、ミューテックスによって保護されている挿入、削除、およびフェッチのメソッドを作成します。コードは次のようになります

type MyStruct struct {
    mu    sync.Mutex
    myMap map[string]string
}

func (myStruct *MyStruct) Add(val string) {
    myStruct.mu.Lock()
    myStruct.myMap[val] = val
    myStruct.mu.Unlock()
}

func (myStruct *MyStruct) Remove(val string) {
    myStruct.mu.Lock()
    delete(myStruct.myMap, val)
    myStruct.mu.Unlock()
}

func (myStruct *MyStruct) Fetch(val string) string {
    myStruct.mu.Lock()
    ret := delete(myStruct.myMap, val)
    myStruct.mu.Unlock()
    return ret
}

ここまでは順調ですね。

ただし、一部のクライアントはMyStructループする必要がありますがmyStruct.myMap、ここで私の質問があります。MyStruct のメソッドで実行されていないループ操作も同時に安全にするための最良の設計はどれですか? 現在、2つのオプションが表示されます

  1. マップmyMapとミューテックスmuMyStructpublic にして、ループ スレッドを安全にする責任をクライアントに移します。これは単純ですが、どういうわけか、MyStructクライアントをあまり気にしないように感じます
  2. すべてを非公開にして、安全にプレイしたいクライアントにマップのコピーを返すメソッドを追加します。これは「カプセル化」の観点からは優れているように見えますが、同時に、少し重く聞こえます

他に可能性はありますか?どちらのデザインが優れているかについて何か提案はありますか?

4

1 に答える 1