【问题标题】:static method call stack in javajava中的静态方法调用栈
【发布时间】:2020-01-21 08:21:11
【问题描述】:

假设我有一个代码:

public static int process(customObject obj){
// some process and then return some count
return obj.getCount();
}

如果来自两个不同类的两个方法同时调用process 方法。 在这种情况下 java 将如何管理调用堆栈?

  • process 是否只有一个调用堆栈,调用方法将共享此堆栈?
  • process 是否有两个调用堆栈,调用方法会有自己的堆栈副本?

如果case-1,java如何知道它应该返回哪个调用方法的结果(这种行为在多线程环境中会如何变化)?

注意:CustomObject 是一个父类型,它可以有多个实现的类型。

【问题讨论】:

  • 每个线程都有自己的堆栈。你需要确保你的代码是线程安全的,如果它被多个线程使用。 static 与这些都无关。
  • 您上次的编辑毫无意义。您首先要讨论同时调用一个方法。因此,您处于多线程环境中。一个线程不能“同时”做一件以上的事情。
  • 你在当前表单中的静态方法无论如何都不会在堆栈上存储任何东西。
  • 添加到@Thilo 的评论中,如果您声明原语和对象分配,它们将被跨线程复制,但对象将存储在堆中(因此不会重复)
  • static 在这里真的没有什么不同。唯一的区别是static 方法中没有this(但您在这里没有使用它)。 customObject 的类型也无所谓,真的。

标签: java memory static-methods callstack


【解决方案1】:

堆栈是每个线程而不是类/对象/方法...

进程是否只有一个调用堆栈,调用方法会共享这个堆栈? - 不,会有 2 个

进程和调用方法会有两个调用栈吗? - 每个线程都有一个栈,但 obj 将是同一个对象两者都存储在堆中(考虑到您将使用相同的 obj 作为参数)

【讨论】:

  • obj 也可以是两个不同的对象。取决于调用者传入的内容。
  • 那么,如果方法是static,每个调用者都会有它自己的那个方法的副本?
  • 复制是什么意思?该方法的字节码只存在一次。但是局部变量和参数(如您的obj)是使用堆栈(每个线程都有自己的堆栈)传入的。
  • 我知道你要去哪里,是的,无论方法是否是静态的,都适用相同的规则(为每个堆栈/堆栈跟踪/线程复制原语和引用,而不是对象)
  • 如果TypeATypeBcount 有不同的值,并通过不同的方法传递给process,那么调用者方法是否有可能接收到任何类型的计数,不管是什么输入他们已经通过了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多