たとえば、コレクションが脅威ではない場合、次のようになります。
var myDic = new Dictionary<string, string>();
マルチスレッド環境では、これは以下をスローします:
string s = null;
if (!myDic.TryGetValue("keyName", out s)) {
s = new string('#', 10);
myDic.Add("keyName", s);
}
1つのスレッドがKeyValuePairをディクショナリmyDicに追加しようとしているときに、別のスレッドがTryGetValue()を実行する場合があります。コレクションの読み取りと書き込みを同時に行うことはできないため、例外が発生します。
ただし、一方で、これを試してみると:
// Other threads will wait here until the variable myDic gets unlocked from the preceding thread that has locked it.
lock (myDic) {
string s = null;
if (!myDic.TryGetValue("keyName", out s)) {
s = new string('#', 10);
myDic.Add("keyName", s);
}
} // The first thread that locked the myDic variable will now release the lock so that other threads will be able to work with the variable.
次に、突然、同じ「keyName」キー値を取得しようとする2番目のスレッドは、最初のスレッドがすでに追加したので、それをディクショナリに追加する必要がなくなります。
つまり、スレッドセーフとは、オブジェクトが複数のスレッドによる同時使用をサポートすること、またはスレッドセーフを気にすることなくスレッドを適切にロックすることを意味します。
2.GhostScriptがスレッドセーフになったとは思いません。主に複数のスレッドを使用してタスクを実行しているため、パフォーマンスが向上します。それだけです。
3.予算と要件によっては、価値がある場合があります。しかし、ラッパーを中心に構築する場合は、おそらくそれが便利な場合にのみlock()を実行できます。または、マルチスレッドを自分で使用しない場合は、スレッドセーフにお金を払う価値はありません。これは、アプリケーションがマルチスレッドを使用している場合にのみ、ライブラリがスレッドセーフでないという結果に苦しむことがないことを意味します。あなたが本当にマルチスプレッドでない限り、スレッドセーフなライブラリにお金を払う価値はありません。