Java:通过反射多次访问同步方法?

标签 java multithreading servlets reflection synchronization

我的一个类(class)有一个非常奇怪的行为,我不知道到底发生了什么。

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

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

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

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

另外,对于最初的问题(servlet 就像“重新加载”本身),您有什么想法吗?在这个问题中,我认为可能发送了一个使 servlet 重新加载的 header ,但不确定。

编辑:

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

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

Ant 被调用的方法是:

public synchronized String procesar(String url,String nu_spid) throws CargaPorInterfaseException{ //... 更多处理 }

最佳答案

您可能想了解更多有关synchronized 功能的背景知识。

I made the "reflected" method synchronized, so no matter how many times it got requested, one request will finish [...]

方法上的

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

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

关于Java:通过反射多次访问同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6428020/

相关文章:

java - 无法在 JSP 中设置 header 。响应已经提交

python - 为什么 GIL 替代方案会对性能产生影响?

java - 等待 future 的名单

java - 用另一种语言包装 C++ 对象的策略——内存管理

java - 带有 Select Query 的 Jooq AddCondition 方法

java - 如何在 Java 中相对于单个线程同步一组多个线程

java - 如何将对象数组从 Flex 发送到 Java Servlet

servlets - 如何在java web应用程序中指定过滤器优先级?

java - 如果java中的线程正在运行并且我不拥有任何对它的线程引用,线程是否会被垃圾收集

java - 委托(delegate)给线程,同时保持线性可读性