2

私はこの質問を形成するのに苦労しているので、静的メソッドに関する通常の議論を繰り返さないように、いくつかの方法でそれを述べようとします。これは、アーキテクチャに関する問題かもしれません。

渡された変数を受け入れる静的クラスに静的メンバーがある場合、操作が頻繁に使用され、長時間実行されると、データの衝突/破損のリスクがありますか?IE:データベースへの永続化のためにオブジェクトグラフタイプを受け入れるデータアクセスクラス。

例えば:

namespace MyApp.DAL.People
{

public static class Person
{
    public static void Insert(Entities.People.Person p)
    {
        // ADO.net code, try catch etc, execute to db, call other private method
        ....
        Helper(p);
    }

    private static void Helper(Entities.People.Person p)
    {
        // do work...

    }
}

}

ユーザー「A」がPerson.Insert(myNewPerson)呼び出し操作を開始すると、ユーザー「B」が静的クラスとメソッドを使用して「個人オブジェクト」をデータベースに保存する前に、そのプロセスは完全に終了します。

操作はシリアルおよび非同期であり、静的クラスの使用を本質的にブロックしていますか?

これは、アプリケーション(開発者)がアプリケーションスペースで複数のスレッドを使用しようとした場合にのみ問題になりますか?

アプリケーション用に別のスレッドを明示的に起動しない限り、すべてが単一のスレッドで実行されていますか?

ちなみに、これはSOに関する私の最初の投稿です-質問/回答を投稿するために時間を割いてくれた皆さんに特に感謝します-あなたの時間はありがたいです!

4

2 に答える 2

3

2つの異なるスレッドPerson.Insertが同時に呼び出すと、両方が同時に実行されます。メソッドに明示的なブロッキングがない限り。

pスレッドによってパラメータに渡されたデータには、スレッドAからアクセスできませんB。もちろん、これら2つのスレッドが完全に異なるオブジェクトインスタンスへの参照を渡したと仮定します。

Insertメソッド内の何も外部スコープの何かにアクセスしない限り、呼び出しは完全に安全です。たとえば、すべてのメソッドローカル変数は2つのスレッドで異なります。問題が発生し始めたのは、メソッド(またはメソッドが呼び出すメソッド)が外部スコープのデータにアクセスし始めたときだけです。

于 2013-03-26T19:34:13.793 に答える
0

可変データ構造へのマルチスレッドの非同期書き込みがある場合、破損が常に発生する可能性があります。静的メンバーは、この点で特別ではありません。それらへのアクセスをロックしたい場合は、明示的にロックする必要があります。

public static class Person {
    private readonly object syncLock = new object();

    public static void Insert(Person p) {
        lock(syncLock) {
            //...
        }
    }

    // etc...
}

注:マルチスレッドアクセスを実行していない場合は、1つのスレッドのみを使用するため、すべてがシリアルで実行されます。

于 2013-03-26T19:34:00.347 に答える