【问题标题】:Java: A synchronized method is accessed several times by reflection?Java:通过反射多次访问同步方法?
【发布时间】:2011-09-19 15:48:30
【问题描述】:

我的一个班级有一个非常奇怪的行为,我不知道到底发生了什么。

1) 我有一个 JSP,它使用 AJAX 向 Servlet 发送请求 2) servlet 以如下方式处理这个请求: - 它对一个类进行反射,然后调用一个方法(从 JSP 作为参数提供),然后将方法的结果输出回 Ajax。

所以这是最初的问题,然后是我想出的部分解决方案:

对该方法的调用被执行了多次,但我不知道为什么。 JSP-Ajax只调用一次(多次测试),但servlet就像“重新加载自己”,多次调用该方法,从而导致过程出错。由于我找不到 servlet 发生了什么,我使“反射”方法同步,所以无论它被请求多少次,一个请求都会完成,然后另一个请求完成,依此类推。我在输出中放了几条消息,写了访问方法的时间和完成工作的时间。

但是......表明它已被访问的消息,在抛出结束消息之前被写入了几次......所以我不明白,也许同步不适用于反射?我错过了什么,为什么在完成之前多次访问该方法?根本不明白。你能帮帮我吗?

另外,您对原始问题有什么想法吗(servlet,例如“重新加载”本身)?在这个问题中,我认为可能发送了一个标头,使 servlet 重新加载,但不确定。

编辑:

其实我在做一个实例。这是我的 servlet 代码:

Class clase = Class.forName("com.cargaporinterfase.CargaPorInterfase_"+cd_matriz); Object obj = clase.newInstance(); Method met = clase.getDeclaredMethod(metodo, new Class[]{String.class, String.class});

Ant 被调用的方法是:

public synchronized String procesar(String url,String nu_spid) throws CargaPorInterfaseException{ //... more processing }

【问题讨论】:

  • 即使在反射调用该方法时也应该强制执行同步。也许您可以发布似乎被多次调用的同步方法的代码。此外,我会在 doGet 方法的开头以及调用您的服务方法之前和之后将日志记录添加到 servlet 本身。
  • 您每次调用时是否使用createInstancesynchronized 基于每个实例
  • 我认为我的问题是你所说的安德烈亚斯(至少是同步的问题),我将上面的代码粘贴在原始问题中。谢谢!
  • 您需要找出 servlet 自身重新加载的原因,这是不正常的。 Mike Deck 关于日志记录的建议是一个很好的起点。

标签: java multithreading servlets reflection synchronization


【解决方案1】:

您可能想了解更多关于 synchronized 的作用的背景信息。

我使“反射”方法同步,所以不管多少 被请求的次数,一个请求 将完成 [...]

方法上的synchronizedsynchronized(this) {...} 相同,其中this 是您调用该方法的对象。

很可能您正在处理同一类的多个不同实例(您正在使用反射),在这种情况下synchronized 不会像您想象的那样工作。 此外,在反射对象上同步与按请求同步完全不同(我认为您必须在 Servlet 实例上同步,尽管在某些情况下您可能还具有多个实例。)

【讨论】:

    【解决方案2】:

    一些假设:

    当你说“它对一个类进行反射”时,我猜这意味着你正在使用反射来创建一个新对象。

    我猜你调用的方法是实例方法(不是静态的)。

    因此,如果这些猜测是正确的,那么使您通过反射调用的方法同步并不能防止调用重叠,因为您每次都在不同的对象上调用该方法。如果将synchronized 关键字添加到方法定义中,它会使用调用该方法的对象作为其锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2022-01-11
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多