C # - Что является более эффективным и потокобезопасным? статические или мгновенные занятия? - PullRequest
2 голосов
/ 19 апреля 2010

Рассмотрим следующие два сценария:

//Data Contract
public class MyValue
{
}

Сценарий 1: Использование статического вспомогательного класса.

public class Broker
{
    private string[] _userRoles;

    public Broker(string[] userRoles)
    {
        this._userRoles = userRoles;
    }

    public MyValue[] GetValues()
    {
        return BrokerHelper.GetValues(this._userRoles);
    }
}

static class BrokerHelper
{
    static Dictionary<string, MyValue> _values = new Dictionary<string, MyValue>();
    public static MyValue[] GetValues(string[] rolesAllowed)
    {
        return FilterForRoles(_values, rolesAllowed);
    }
}

Сценарий 2: Использование класса экземпляра.

public class Broker
{
    private BrokerService _service;

    public Broker(params string[] userRoles)
    {
        this._service = new BrokerService(userRoles);
    }

    public MyValue[] GetValues()
    {
        return _service.GetValues();
    }
}

class BrokerService
{
    private Dictionary<string, MyValue> _values;
    private string[] _userRoles;

    public BrokerService(string[] userRoles)
    {
        this._userRoles = userRoles;
        this._values = new Dictionary<string, MyValue>();
    }

    public MyValue[] GetValues()
    {
        return FilterForRoles(_values, _userRoles);
    }
}

Какой из сценариев [Брокер] будет лучше всего масштабироваться, если используется в веб-среде с около 100 различными ролями и более тысячи пользователей.

ПРИМЕЧАНИЕ. Не стесняйтесь предлагать альтернативный подход.

Ответы [ 4 ]

5 голосов
/ 19 апреля 2010

Вы можете испортить потоки, используя статические или экземпляры классов. Однако ключом к правильному созданию потоков является то, что два потока не пытаются одновременно обращаться к одному и тому же ресурсу.

Со статическими классами, по определению, существует только одна его копия, которой все потоки должны делиться красиво.

С помощью классов экземпляров вы МОЖЕТЕ создать один экземпляр для каждого потока. Если вы гарантируете, что каждый поток обращается только к своему собственному экземпляру, и что свойства и методы экземпляра, в свою очередь, не обращаются к другим общим ресурсам, они должны быть безопасными для потоков.

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

2 голосов
/ 19 апреля 2010

Оба подхода имеют свои проблемы. Мой обычный подход - использовать классы экземпляров (потому что их также проще тестировать), но вы можете определить статический экземпляр этого класса, если вам нужны данные для каждого потока. В любом случае, если ваши данные будут переданы, вы, вероятно, захотите исследовать ReaderWriterLockSlim класс .

1 голос
/ 19 апреля 2010

Классы экземпляров были бы более потоко-безопасными, так как каждый поток может иметь одну копию на поток, с другой стороны, у статических классов вы можете иметь только одну, поэтому, если вам нужны потоки для совместного использования данных, убедитесь, что вы реализовали какой-то механизм блокировки что они хорошо играют друг с другом. Также укажите, в каком контексте эффективности вам требуется скорость или потребление ресурсов.

0 голосов
/ 05 февраля 2013

Абсолютно более поточно-безопасного выбора не существует. Если вы не собираетесь получать доступ к общим данным, нет никакой разницы, а если и есть, то все равно нет никакой разницы, но более вероятно, что статические классы использовали общие данные потому что они статичны, и почти все для них является общим. так что используйте мгновенные занятия. Как и в случае синглтон-паттерна Мартина Фаулера, даже если вы хотите что-то статичное, лучше сделать его одноэлементным, потому что оно более гибкое.

...