【问题标题】:call a method of a static instance in EJB在 EJB 中调用静态实例的方法
【发布时间】:2012-09-04 10:46:41
【问题描述】:

我猜测我们的代码库中有不正确的代码,但我不确定。所以我们得到了这样的 EJB:

@Stateless
public class MyEjb {
  private static Something sg = new Something();
  public void doSomething() {
    sg.execute();
  }
}

Something 类是一个普通的类:

public class Something {
  public void execute() {
    ...
  }
}

由于 MyEJB 是无状态的 EJB,所以方法 doSomething 可以同时调用多次。

我的问题来了:如果 doSomething() 被同时调用了两次,那么其中一个调用将被阻塞,直到第一个调用完成?我的猜测是它被阻止了,因为只有一个静态实例。
如果我是对的,上面的代码并不好,因为类 'Something' 的方法 'execute' 是我的 EJB 的瓶颈。

谢谢, 五、

【问题讨论】:

  • 请注意,我认为整个 EJB 部分在这里根本不相关,我们只是有一个类的普通静态实例,如果 myEJB 是普通类,场景将是相同的.
  • 嗨,拉斯穆斯,没错。我之所以提到 EJB,是为了强调只有一个 JVM。不管你是对的,这里 EJB 并不重要。

标签: java static ejb instance-variables simultaneous-calls


【解决方案1】:

两个调用将同时运行,除非您使用“同步”块或“写锁”来限制访问。

【讨论】:

  • 感谢您的回复。我不明白的是我们在同一个 JVM 中,所以 Something 类只有一个实例。一个实例的方法怎么可能同时运行更多次......?还是我完全不知所措?谢谢!
  • 我不是 100% 了解细节,所以如果我在这里错了,请告诉我。方法中的代码不是按实例存储的,而是存储在类加载器 ONCE 中的某个位置。不管静态与否。这就是为什么对象实例不会因为包含更多代码而变大的原因。您不需要方法的“实例”来执行它,多个线程可以同时在同一方法中执行代码,但是局部变量存储在每个线程的堆栈中。仅当方法使用共享资源(例如类变量或文件 IO)时才需要同步。
猜你喜欢
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多