可能是我的问题很愚蠢。但我想清除它。我们知道函数只在内存中加载一次,当你创建新对象时,只创建实例变量,永远不会创建函数。我的问题是,假设有服务器和所有客户端访问名为createCustomer()的方法。假设所有客户端都执行了在服务器上触发createCustomer的操作。因此,如果方法处于执行中间并且新客户端触发它。这个新请求会被等待吗?或新请求也将开始执行该方法?当内存中只有一个函数副本时,如何管理它?没有书提到这类问题的答案。所以我在这里发帖,我一定得到答案:)。
答案 0 :(得分:4)
函数是代码,然后在内存上下文中执行。代码可以并行运行多次(字面上在多处理器机器上并行运行),但每个调用都将在不同的内存上下文中执行(从局部变量的角度来看)这样)。在低级别,这是有效的,因为函数将局部变量作为偏移量引用到内存中,称为“stack”,由处理器寄存器指向称为“堆栈指针”(或在某些解释语言中,该寄存器在更高级别的模拟,并且该寄存器的值对于对该函数的不同调用将是不同的。因此,对函数x
的一次调用中的foo
局部变量与另一次调用x
中的foo
局部变量位于内存中的不同位置,无论这些调用是否同时发生。
实例变量不同,它们通过引用(指针)引用分配给对象实例的内存。同一功能的两个正在运行的副本可能同时在完全访问同一个实例变量;同样,两个不同的功能可能会这样做。这就是我们遇到"threading" or concurrency问题,同步,locks,race conditions等原因。但这也是事情高效的原因之一。
答案 1 :(得分:1)
这是一个基本的线程问题,您可以在http://en.wikipedia.org/wiki/Thread_(computer_science)查找。
不要考虑执行的代码,而是考虑更改的线程的内存上下文。实际代码的位置和内容并不重要,如果它是相同的代码或重复或其他内容。
基本上,可能会在早先调用函数时调用该函数。这两个调用是独立的,甚至可能并行运行(在多核机器上)。实现这种独立性的方法是为每个线程使用不同的堆栈和虚拟地址空间。
有多种方法可以同步呼叫,因此其他呼叫者必须等到第一个呼叫结束。这也在上面的链接中解释。
答案 2 :(得分:1)
它被称为“多线程”。如果每个请求都有自己的线程,并且对象包含可变数据,则每个客户端都有机会根据需要修改对象的状态。如果编写对象的人不注意线程安全,那么最终可能会遇到请求之间处于不一致状态的对象。