C#とスレッディング - 私はconstを使用するとロックされますか?

const値をロックとして使うことができるのであれば、私はちょうど興味があります。例えば:

private const string counterKey = "Requests_Sec";
public static object RequestsPerSecond()
{
   lock (counterKey)
   {
      //do something...
   }
}

私はconstが静的であると推測したので、この状況で使用しました。静的な文字列に戻すことが問題を解決したのであれば興味があります。

EDIT: Most of you are saying that string is the problem rather than const. To rephrase my question - would this be OK for locking:

private const object counterKey = new object();

EDIT: My bad - you can't have const object... what I take away from this is always lock on object _sync = new object(); and make it static if needed.

3
constオブジェクトは値nullのみを持つことができます。オブジェクトとして宣言することができたとしても、インラインプールの文字列のインスタンスになりますので、問題は同じになります。
追加された 著者 phoog,
追加された 著者 Brian Gideon,

3 答え

これは静的なconstでロックするのではなく、文字列をロックすることについてです。 constとマークできる変数は2種類しかありません。それらはプリミティブ型と文字列です。最初のものはロックできません。文字列のインターセクションのために、文字列をconstにするかどうかは、文字列のインスタンスに関して大きな違いをもたらす可能性があります。

For an answer on the question how locking on strings work, see: Using string as a lock to do thread synchronization

基本的には、文字列をロックするのは安全ではありません。

4
追加された
値がnullである限り、参照型はconstでも構いません。もちろんnullにロックすることはできません。
追加された 著者 phoog,

答えはおそらく:はい、ロックが動作します。しかし、私は言う必要があります:いいえ、これをしないでください。それが動作しても、他の人を混乱させる。通常のオブジェクトロックを使用する方がはるかに優れています。

3
追加された

constの部分が主な問題からあなたを捨てています。

任意の文字列は、メモリ内の単一の表現にマップされます。一つの場所で宣言された "a"は、他の場所で宣言された "a"と同じです。 Ergoは、ほとんどの場合、単に文字列にロックすると、モニタは同じ文字列を使用する場所で待機することになります。これは、同じプロセスのMutexロックのようなものです。

その文字列への参照をロックしていないことに注意することが重要です。その文字列へのすべての参照をロックしています

1
追加された