多线程时,分享呼叫和引用呼叫是否有所不同?

Sha*_*wat 5 java evaluation-strategy

如果使用函数调用函数Call-by-Reference,则对函数内部变量所做的任何更改都会立即影响调用者.因为Call-by-Sharing,它在功能结束时受到影响.

问题1: Java是否使用Call-by-Sharing而不是Call-by-Reference

问题2:我认为,Call-by-Sharing不同于Call-by-Reference ,而多线程.它的创建只是为了减少在某些其他线程中使用时值的并发重写; 提供一致性.我对吗?

Ste*_*n C 9

我建议您不要使用"共享呼叫"术语.正如本维基百科文章所述:

"然而,术语"通过共享调用"并不常用;术语在不同来源之间是不一致的.例如,在Java社区中,他们说Java是按值传递的,而在Ruby社区中,他们是尽管这两种语言表现出相同的语义,但是说Ruby是传递引用[引证需要].分享共享意味着语言中的值基于对象而不是基本类型."

"虽然这个术语在Python社区中有广泛的用法,但其他语言(如Java和Visual Basic)中的相同语义通常被描述为按值调用,其中值隐含为对象的引用."

底线是Java使用"通过共享调用"......但他们并没有这样称呼它,如果你想让Java人员了解你,你也许不应该这样做.


我认为Call-by-Sharing仅在多线程时与Call-by-Reference不同.它的创建只是为了减少在某些其他线程中使用时值的并发重写; 提供一致性.我对吗?

不,你不对.

"共享调用"实际上意味着在值是对象引用的情况下"按值调用".真正的"引用调用"意味着您(实际上)传递变量的地址,并且被调用的方法可以更新变量.

  • 对象的变量是对内存中对象的引用,通过共享调用,当传递一个对象(对对象的引用)时,引用将被复制,并且实际参数和形式参数都将引用同一个对象。对象的值可以更改,这使得它类似于按引用调用,但它与按引用调用不同,因为对对象的引用被复制,因此无法更改对象的标识。因此,即使在使用共享调用的交换例程之后,原始引用变量仍将引用同一对象。 (2认同)