在思考一下 Java/C# 编程时,我想知道属于对象的方法如何在内存中表示,以及这一事实如何涉及多线程。
- 是为内存中的每个对象单独实例化一个方法还是执行
同一类型的所有对象共享该方法的一个实例?
- 如果是后者,执行线程如何知道哪个对象是
要使用的属性?
- 是否可以修改方法的代码
C# 用反射为一,且多个对象中只有一个对象
相同类型?
- 不使用类属性的静态方法总是线程安全的吗?
我试图对这些问题下定决心,但我对他们的答案非常不确定。
源代码中的每个方法(在 Java、C#、C++、Pascal 中,我认为每种 OO 和过程语言...)都只有one复制到二进制文件和内存中。
一个对象的多个实例具有单独的字段,但都共享相同的方法代码。从技术上讲,有一个过程需要隐藏this
参数来提供在对象上执行方法的错觉。实际上,您正在调用一个过程并将结构(一包字段)与其他参数一起传递给它。下面是一个简单的 Java 对象和或多或少等效的伪 C 代码:
class Foo {
private int x;
int mulBy(int y) {
return x * y
}
}
Foo foo = new Foo()
foo.mulBy(3)
被翻译成这个伪 C 代码(封装是由编译器和运行时/VM 强制执行的):
struct Foo {
int x = 0;
}
int Foo_mulBy(Foo *this, int y) {
return this->x * y;
}
Foo* foo = new Foo();
Foo_mulBy(foo, 3)
您必须区分代码和局部变量以及它所操作的参数(data)。数据存储在每个线程本地的调用堆栈上。代码可以由多个线程执行,每个线程都有自己的指令指针副本(放置在当前执行的方法中)。也因为this
是一个参数,它是线程本地的,因此每个线程可以同时操作不同的对象,即使它运行相同的代码。
也就是说,您不能仅修改一个实例的方法,因为该方法代码在所有实例之间共享。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)