Статические методы и многопоточность - PullRequest
1 голос
/ 24 февраля 2011

Могут ли быть проблемы с наличием статического класса только со статическими методами (без свойств, полей или чего-либо еще) и одновременным доступом нескольких методов к этим методам?

Ответы [ 4 ]

5 голосов
/ 24 февраля 2011

Пока нет общего состояния или внешних ресурсов , тогда: никакого риска. Вы упомянули «нет полей» и т. Д., Что хорошо - если только они не косвенно говорят о разделяемом состоянии (возможно, с помощью какого-то общего аргумента, который в этом сценарии не является поточно-ориентированным, или через некоторые другие вызываемые им служебные методы, которые беспорядочно делят состояние), все будет в порядке.

0 голосов
/ 24 февраля 2011

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

0 голосов
/ 24 февраля 2011

Потенциально, да.

Представьте себе:

class Logger
{
    WriteToLogs(string msg)
    {
        // Write data to file1
        ... 

        // Write data to file2
        ...
    }
}

Теперь представьте, что у вас есть несколько потоков, пытающихся вызвать WriteToLog () одновременно.Что происходит, когда поток 2 запланирован до того, как поток 1 завершит запись в файлы журнала?В этом случае вы можете получить всевозможные повреждения данных.

Статические классы и методы НЕ по своей природе НЕ обеспечивают какую-либо форму синхронизации потоков, блокировки и т. Д. Это ВАМ нужно спроектировать и реализовать.

0 голосов
/ 24 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...