2

どのスレッドも変数を変更しません。彼らは皆読んでいます。これは安全ですか?

4

2 に答える 2

6

これは、スレッドによって共有されているリソースによって異なります。次の例を考えてみましょう。

public class MyClass
{
    private int i;
    public int Foo { get { return i++; } } 
}

public static class SharedResources
{
    public static const string SharedString;
    public static readonly MyClass SharedMyClass;
}

このコードサンプルでは、SharedString​​文字列はC#で読み取り専用であるため、への参照はスレッドセーフです。ただし、どのスレッドもいつでも呼び出すことがSharedResources.SharedMyClass.Fooでき、増分はスレッドセーフではないため(を使用しない限りInterlocked.Increment)、このプロパティを読み取るスレッドは一貫性のない結果を得る可能性があります。

つまり、パブリックAPIが読み取り専用であるが、内部がスレッドセーフではないクラスの場合、複数のスレッドがそのクラスから読み取るだけでは安全ではありません。

于 2013-03-24T05:28:39.457 に答える
1

並行性のバグが表面化するためには、少なくとも 1 つのアクセスが書き込み/変更アクセスである必要があります。

ゲッターを変数と間違えないように注意してください。それらは、アクセス時に知られていない影響を与える可能性があります。

于 2013-03-24T05:15:46.087 に答える