public class MyConfigurationData
{
public double[] Data1 { get; set; }
public double[] Data2 { get; set; }
}
public class MyClass
{
private static object SyncObject = new object();
private static MyConfigurationData = null;
private static MyClass()
{
lock(SyncObject)
{
//Initialize Configuration Data
//This operation is bit slow as it needs to query the DB to retreive configuration data
}
}
public static MyMethodWhichNeedsConfigurationData()
{
lock(SyncObject)
{
//Multilple threads can call this method
//I lock only to an extent where I attempt to read the configuration data
}
}
}
내 응용 프로그램에서는 구성 데이터를 한 번만 만들고 여러 번 여러 번 사용해야합니다. 즉, 한 번 쓰고 여러 번 읽습니다. 또한 필자는 쓰기 작업이 끝날 때까지 읽기가 발생하지 않아야 함을 확신하고자했습니다. 즉, MyConfigurationData를 NULL로 읽으 려하지 않습니다.잠금이없는 정적 구성 데이터를 구현하는 방법이 있습니까?
정적 생성자는 AppDomain에서 한 번만 호출된다는 것을 알고 있습니다. 그러나 구성 데이터를 준비하는 동안 어떤 스레드가이 데이터를 읽으려고하면 어떻게 동기화를 효과적으로 수행 할 수 있습니까? 결국, 필자는 읽기 작업의 성능을 향상시키고 자했습니다.
내 목표를 잠금없이 구현할 수 있습니까?
설명해 주셔서 감사합니다. – Imran
+1. @Imran, 결과 객체는 기존의 "lock-free"(코드에서 잠금/중요 섹션을 제외하고 똑똑한 코드 조직을 사용하여 대부분의 InterlockedXXXX 작업을 사용하지 않음) 런타임에 필요하지 않습니다. 대부분 likley는 잠금을 사용하여 생성을 직렬화합니다 정적 객체의 –
@AlexeiLevenkov, 알겠습니다. 런타임에서 정적 객체를 만드는 동안 잠금을 사용하면 괜찮습니다. 나는 그 정적 인 객체들에 대한 lock-free 읽기에 대해서만 염려한다. – Imran