So weit ich von Kollegen und dem Internet verstanden habe, ist es eine schlechte Übung, das Objekt zu synchronisieren, das synchronisiert wird, aber was ich nicht verstehe, ist warum?Sperren für das Objekt, das synchronisiert wird oder ein dediziertes Sperrobjekt verwendet?
Die folgende Klasse soll Einstellungen in ein Wörterbuch laden, und es gibt auch eine Methode zum Abrufen von Einstellungen.
public class TingbogSettingService : ITingbogSettingService
{
private readonly ISettingRepository _settingRepository;
private readonly ICentralLog _centralLog;
private Dictionary<string, ISetting> _settingDictionary = new Dictionary<string, ISetting>();
public TingbogSettingService(ISettingRepository settingRepository, ICentralLog centralLog)
{
_settingRepository = settingRepository;
_centralLog = centralLog;
}
public ISetting GetSetting(string settingName)
{
ISetting setting;
if (!_settingDictionary.TryGetValue(settingName, out setting))
{
return null;
}
return setting;
}
public void LoadSettings()
{
var settings = _settingRepository.LoadSettings();
try
{
lock (_settingDictionary)
{
_settingDictionary = settings.ToDictionary(x => x.SettingName);
}
}
catch (Exception ex)
{
_centralLog.Log(Targets.Database, LogType.Error, $"LoadSettings error: Could not load the settings", new List<Exception>() { ex });
}
}
}
Während der loadsettings Funktion Ich möchte die _settingDictionary sperren, so dass GetSetting gesperrt werden, bis die neuen Einstellungen geladen werden.
Soll ich stattdessen ein dediziertes Sperrobjekt verwenden?
Zum Beispiel:
private static readonly object m_Lock = new object();
…
lock (m_Lock)
EDIT
Ich dachte, dass Schloss (_settingDictionary) würde die _settingDictionary sperren sich jedoch merke ich jetzt, dass seine nicht der Fall ist. Was ich wollte, war zu verhindern, dass andere Threads auf _settingDictionary zugreifen, bis die neuen Einstellungen geladen wurden (LoadSettings-Methode abgeschlossen). Da nur 1 Thread das _settingDictionary aktualisiert, denke ich, dass ich dort keine Sperre brauche.
Zum Schließen der Frage - etwas ähnliches wurde schon einmal gefragt, ja, aber das Szenario ist nicht das gleiche. Ich habe aus deinen Antworten gelernt, und es wird schwer sein, einen Gewinner unter euch zu finden.
Was hat Ihr Kollege gesagt, als Sie ihn gefragt haben, warum es schlecht ist? – Default
Das kann zu Threading-Problemen führen und ist schwer zu diagnostizieren. Und dass die Instanzvariable (_settingDictionary) tatsächlich nicht gesperrt ist, obwohl sie so aussieht. Ich kann nicht sehen, warum. – Kenci
Welche Version von .NET ist das? –