0

異なるスレッド間で共有されるこの静的リストがあるとしましょう:

public static List<myClass> fooList = new List<myClass>();

今、スレッドでこの共有リストにアクセスして、独自のプライベートリストを作成したいのですが、次のことをしたいと思います:

List<myClass> newFooList = new List<myClass>();

lock (fooList)
{
   foreach (myClass element in fooList)
   {
    newFooList.Add(element);
   }
}

しかし、そうすると、共有リストと同じ要素を参照する新しいリストを作成しているので、後でロックなしで newFooList にアクセスすると (そうあるべきです)、実際には同じ要素にアクセスしています。共有リストなので、ロックに違反していますよね?

解決策は、参照を渡す代わりに、fooList の要素と同じ内容の newFooList の新しい要素を作成することですか?

4

2 に答える 2

1

リスト自体ではなく、リスト要素へのアクセスを同期する必要がある場合。次に、リストではなく、これらの要素のメソッドへのアクセスを同期します。

于 2013-08-24T23:47:28.130 に答える
1

myClassはい、スレッド間でリスト要素へのアクセスを同期する必要がないようにする場合は、リストのディープ コピーを実行します。

ロックに違反する用語に関しては、 の要素の同期が失われていると言ったほうがよいでしょうmyClass。のインスタンスのロックは、そのfooListインスタンスに対してのみ意味があります。オブジェクトのインスタンスへのアクセスがmyClassリストを介してのみ許可されている場合、同じロックオンfooListによってそれらも保護されます。List コンテナの浅いコピーを作成した場合lock (myClass element)、オブジェクトのインスタンスごとにmyClass、まったく異なるロックが必要になります。したがって、同期の欠落についての私の説明です。

于 2013-08-26T02:04:18.183 に答える