ゼロと抹消の間golang標準ライブラリsync.Map違い

これは、特定の状態を区別し、ゼロ状態を抹消するために、sync.Mapソース詳細な解釈が、異なる焦点状態エントリはありません。

sync.Mapストレージ構造エントリの3つの値、値(真値)、それぞれ、ゼロは、抹消(マーカーとしての任意のポインタ)を有する値です。もしそうであれば、次いで本明細書にそれぞれ呼ばれる状態マシンとして、三つの状態値、ゼロ、抹消。

要約:

値のステータス:エントリは、真の値の内部に格納されています。このとき、対応するエントリキーは、3例、キーが存在するだけリードで存在する、汚いにのみ存在キー、読み取りおよび村汚いです

ゼロ状態:それに対応する値(すなわち、エントリ)p値がゼロに設定されているときにキーが削除され読み取ります。この場合、(ditryがnil)キーを読み取り専用あり、読み取りや汚れ中に存在します。

読み込み中唯一の鍵存在この場合や汚れには存在しません:状態を抹消。

抽象sync.Mapは、3つの操作を削除し、撤回、堆積させます。これらの3つの操作の状態を考慮してエントリを変更します。

  1、デポジット:sync.Map初期状態、新しいキーと値のペアk:V:A、まずダーティに格納され、ケースエントリは状態値であるが、鍵は、汚いに存在します。

  2、撮影した:最初の汚れに至るまで、存在していないお読みください。汚い、汚い昇格読み取りが空になったいくつかの読み取り、から取られていません。値は、キーに対応するリードに存在する、状態エントリのままです。

  3、デポジット:BのV:他の鍵kに格納されている場合B、ダーティ・リードにコピー発生し、真のマークされた修正を同時に読み取ります。この時点で、キーAは、状態値への読み取りや汚れ、エントリ内に存在します。

  4、削除:p値がゼロに設定されているキーA、エントリAを削除します。このとき、キーAは、エントリがゼロの状態で、読み込み中に存在し、汚れています。

  5、デポジット:kの別のキー:CのV:C.

  6.テイク:、読むために昇格汚い汚れがクリアされているトリガー、何度もキーCをお読みください。このとき、キーAは、エントリがゼロの状態で、読み取り専用の媒体中に存在します。

  7、デポジット:他の鍵Kに:DのV:D、堆積する場合、リードの発生がダーティコピー、エントリキーゼロ状態を抹消する状態から、鍵Aは読み取り専用に存在します。

  8.テイク:一度多くのキーD、汚れが読み進めトリガーを読む、汚れがクリアされ、その後、キーAが完全に除去されます。

なぜ削除し、値をマークするためにnilを持つ2つの状態を抹消でしょうか?

EXPUNGEが表示されたときに、最初に明確。鍵Aの読み出しの値がゼロにし、他の汚いをコピーする、読み出し動作をトリガするとき、nilは抹消に変換されます。この時、汚れた空ではなく、キーAが汚れには存在しません。キーAの再割り当ては、読んで変更した場合は、すべての値を含め、時間を読むことを推進したときに保護するために、汚い汚い修正同期させる必要があります。

nilが同じキー値が同じにポインタであるため、キー、キーダーティ・リードの状態が読み出し中に存在するか、または(汚い空)にのみ存在し、ダーティ・リードあるときゼロであり、空に見えます両方の場合においてので、キーAの再割り当て、すべてのダーティ考慮しません。

 

 

 

おすすめ

転載: www.cnblogs.com/DillGao/p/11118842.html