2013-09-02 4 views
1

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

В классе, в основном способе, где объект класса С, созданный, чтобы вызвать метод экземпляра, который принимает целое число в качестве параметра:

public <AnyClass> MyMethod(int classVar) 
{ 
    return new <AnyClass>(classVar); 
    // Can have more implementation, using the parameter passed 
} 

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

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

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

Любые предложения/указатели были бы замечательными. Пожалуйста, дайте мне знать, если вам нужно разъяснение.

+0

Если 'return new AnyClass (classVar);' это все, что он делает, то нет. Если происходит другое событие, все зависит от того, изменяет ли он общие ресурсы. –

+0

Локальные переменные и функциональные параметры, передаваемые по значению, не нужно синхронизировать, они уникальны в каждом потоке. –

ответ

1

Вы абсолютно правы!

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

В принципе, вам необходимо блокировать, если и только если два параллельных потока обращаются и изменяют (изменяют) любые данные, разделяемые между ними.

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

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

+0

Спасибо за быстрый ответ –

2

Нет, вы не должны блокировать что-либо здесь:

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

Однако, когда два потока могут видеть один и тот же объект и, по крайней мере, один его модифицирует, вам может потребоваться заблокировать этот объект.

+0

Спасибо всем за быстрый ответ, он находится на линии моего понимания, я знаю, что изменение общего ресурса не может быть выполнено без блокировки, здесь при возврате я просто добавляю значение в тип списка для использования по строке, так что кажется не проблема с реализацией MT –

0

Вы не доступ к любым общим ресурсам в вашем методе, как написано (предполагается, что конструктор для AnyClass также не)

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

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

+0

Спасибо за быстрый ответ –

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