上の同期オブジェクトを作成します。私は、このオブジェクトは以前に明らかな理由もなく連載されたのDataContractの一部であった同期オブジェクト需要
[DataContract]
class C1
{
[DataMember]
private object mySyncObject = new object();
}
に含まれているクラスを持っています。データが含まれていないので、私は同期オブジェクトのDataMemberを省略しました。しかし、DataContractSerializerはデシリアライズ時にデフォルトのctorを呼び出さないため、実行時にNullReferenceExceptionsが使用されます。
lock(mySyncObject) // NullReferenceException
今、私はプロパティでロックオブジェクトへのアクセスをカプセル化し、マルチスレッドアクセスは、プロパティがnullまたは異なるオブジェクトを返すために発生しないことを確実にしたいと思います。
私の改定オブジェクトは、今ではそう簡単にすることができ
[DataContract]
class C1
{
private volatile object mySyncObject = new object();
object SyncObject
{
get
{
if (mySyncObject == null)
{
Interlocked.CompareExchange<object>(ref mySyncObject, new object(), null);
}
return mySyncObject;
}
}
}
のように見えるか、私はここに潜在的な競合状態を見逃していますか?
まあで見つけることができ、実際に私がDataContractsではない別のシリアライザを使用するコードをリファクタリングしたいと思います。制約は、コードが新しい(Json.NET)と古いシリアライザで動作するだけであることです。したがって、シリアライザに依存しているかどうかにかかわらず、特定のシリアライザアトリビュートマジックに依存したくありません。 –
@AloisKrausもっと多くの発見で私の答えを更新しました:) – Icepickle
私はちょうど私が私の側で愚かなエラーで何かを壊していないことを確認したいと思っていました。 –