Как потокобезопасными этот класс?


Так как я понимаю этот код, который я написал, это потокобезопасными, так долго, как ретриверы и вкладчиков являются потокобезопасными. Единственный плохом состоянии я мог видеть, что происходит в том, что поток через ретривера в качестве метода местной в то время как другой поток вызывает RefreshDependencies(), который будет означать, что поток с его как способ местной будет продолжать использовать его, даже если он не один из нынешних вкладчиков/ретриверы, но это должны быть очищены, когда метод локального использования вышла как бы там не корень больше.

также открыты для любых других заметок на код.

public static class DependencyContainer
{
    private const string DEPENDENCIES_LOCATION_APP_SETTINGS_KEY = "DependenciesLocation";

    private static object _lockDependenciesManagement;
    private static string _dependenciesLocation;

    public static IEnumerable<IEntryRetriever> Retrievers { get; private set; }
    public static IEnumerable<IEntryDepositor> Depositors { get; private set; }

    static DependencyContainer()
    {
        _lockDependenciesManagement = new object();
        string dependenciesLocation = ConfigurationManager.AppSettings[DEPENDENCIES_LOCATION_APP_SETTINGS_KEY] ?? typeof(DependencyContainer).Assembly.CodeBase.Replace(@"file:///", "");
        SetDependenciesLocation(dependenciesLocation);
        RefreshDependencies();
    }

    public static string GetDependenciesLocation()
    {
        lock (_lockDependenciesManagement)
        {
            return _dependenciesLocation;
        }
    }

    public static void SetDependenciesLocation(string newDependenciesLocation)
    {
        lock (_lockDependenciesManagement)
        {
            _dependenciesLocation = newDependenciesLocation;
        }
    }

    public static void RefreshDependencies()
    {
        lock (_lockDependenciesManagement)
        {
            // compose/load dependencies in here for writing and retrieving blog entries
        }
    }
}


3937
5
задан 27 августа 2011 в 05:08 Источник Поделиться
Комментарии
1 ответ

Первый пункт я вижу:

private static object _lockDependenciesManagement;

...должны быть:

private static readonly object _lockDependenciesManagement;  

Я не вижу никаких причин, это должно бы меняться.

С возможностью ретриверы перезаписаны во время использования, вы должны вернуть один экземпляр в коллекцию вместо:

//    fields that could be altered while in use if made public
static IEnumerable<IEntryRetriever> _retrievers { get; private set; }
static IEnumerable<IEntryDepositor> _depositors { get; private set; }

public static IEnumerable<IEntryRetriever> Retrievers
{
get
{
// return copy of _retrievers
lock (_lockDependenciesManagement)
{ return _retrievers.ToList(); }
}
}

Ваши потребители смогут теперь управлять работой с собственной копией _retrievers коллекции. Ручка _depositors в том же порядке ...я думаю, что эти шаги позволят сделать коллекции более безопасным в использовании.

4
ответ дан 27 августа 2011 в 05:08 Источник Поделиться