Различаются ли вызовы с помощью общего доступа и вызовы по ссылке только во время многопоточности?

Если функция вызывается с помощью Call-by-Reference, тогда любые изменения, внесенные в переменную внутри функции, немедленно затрагиваются вызывающей стороной. И для Call-by-Sharing, это затрагивается в конце функции.

Вопрос 1: использует ли Java Call-by-Sharing вместо Call-by-Reference?

Вопрос 2: я думаю, что Call-by-Sharing отличается от Call-by-Reference только во время многопоточности. Он создается только для уменьшения одновременного перезаписи значений во время его использования в каком-либо другом потоке; обеспечить последовательность. Я прав?

3 ответа

Решение

Я бы порекомендовал вам не использовать терминологию "Звонок через общий доступ". Как говорится в этой статье в Википедии:

"Тем не менее, термин" вызов с помощью общего доступа "не является общепринятым; терминология не является единой в разных источниках. Например, в сообществе Java говорят, что Java передается по значению, тогда как в сообществе Ruby они скажем, что Ruby является передачей по ссылке [необходима цитата], даже несмотря на то, что оба языка имеют одинаковую семантику. Call-by-shared подразумевает, что значения в языке основаны на объектах, а не на примитивных типах ".

а также

"Хотя этот термин широко используется в сообществе Python, идентичная семантика в других языках, таких как Java и Visual Basic, часто описывается как вызов по значению, где значение подразумевается как ссылка на объект".

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


Я думаю, что Call-by-Sharing отличается от Call-by-Reference только во время многопоточности. Он создается только для уменьшения одновременного перезаписи значений во время его использования в каком-либо другом потоке; обеспечить последовательность. Я прав?

Нет, вы не правы.

"Вызов через совместное использование" действительно означает "вызов по значению" в случае, когда значение является ссылкой на объект. Истинный "вызов по ссылкам" означает, что вы (фактически) передаете адрес переменной, и вызываемый метод может обновить переменную.

Хорошо известен тот факт, что Java передается по значению (для использования более общеупотребительного языка), но большая путаница возникает из-за того, что передача ссылки на объект в метод позволяет этому методу изменять объект в области действия вызывающего. (то есть они "разделяют" объект). Таким образом, некоторые люди ошибочно полагают, что Java является ссылкой для не примитивов. Насколько я понимаю, сказать что-то "вызов за счет совместного использования" просто дает понять, что передаваемое нами значение является ссылкой на объект, а не на сам объект.

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

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

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

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

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

Другие вопросы по тегам