2015-08-25 1 views
-2

Я читаю этот пост stackoverflow, которые дают пример кода, как:Предоставляет ли статический метод поточную безопасность?

static void modifySharedResource(SomeClass sc) 
    { 
     //do something 
     lock (_lock) 
     { 
      //where sc is modified 
     } 
    } 

Мне любопытно, что, почему этот статический метод нужен замок, делает статический метод поточно-в этом примере?

Я также прочитал это post, но я не понял ответа.

Не могли бы предоставить более подробную информацию о моем вопросе, спасибо!

+0

выглядит как синглтон? – user1666620

+4

независимо от того, является ли метод потокобезопасным или нет, зависит от того, обращается ли он к общим ресурсам (статические переменные e.x, ..). Не имеет никакого отношения к тому, является ли метод статическим –

+0

какой-либо другой метод может в настоящее время воздействовать на объект 'sc'. Использование блокировки в обоих местах гарантирует, что эти операции не будут выполняться одновременно. – Jonesopolis

ответ

2

Независимо от того, является ли метод потокобезопасным или нет, зависит от того, обращается ли он к общим ресурсам (статические переменные e.x, ..). Нет ничего общего с тем, является ли метод статическим.

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

С вашим lock (я предполагаю, что _lock является статической переменной), вы все равно не достижения нити безопасности, если sc разделяет и модифицирован где-то в другом потоке.

С помощью метода имени modifySharedResource (параметр совместно), я совершенно уверен, что есть проблема, если параметр также изменен где-то в другом потоке.

В общем, это плохая практике, чтобы изменить входные параметры: https://softwareengineering.stackexchange.com/questions/245767/is-it-an-antipattern-modifying-an-incoming-parameter

-1

Проблема в том, что SomeClass не является потокобезопасным. Статический метод, как он есть здесь, является потокобезопасным.

+0

Я не уверен, как вы пришли к выводу, что метод с // do stuff является потокобезопасным. – SergeyA

+0

Как я уже сказал: 'метод, как у вас здесь, является потокобезопасным. К сожалению, я не могу дать никаких советов по поводу кода, которого нет в примере! Поэтому '// делать что-то 'может быть или не может быть потокобезопасным. –

0

у вас есть недоразумение с потокобезопасной, ключевым словом lock отметок бит в синхронизации индекса блока собственного параметра (_lock в коде) и другой lock не может пройти до тех пор, пока другой фиксатор блокировки не закроет и не вернет бит

Смежные вопросы