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

时间:2011-06-21 15:35:59

标签: java multithreading servlets reflection synchronization

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

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

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

对该方法的调用已经进行了几次,但我不知道为什么。 JSP-Ajax只将其称为ONCE(多次测试),但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 }

2 个答案:

答案 0 :(得分:3)

一些假设:

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

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

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

答案 1 :(得分:3)

您可能希望了解synchronized所做的更多背景信息。

  

我使“反射”方法同步,所以无论多少   它被请求的时间,一个请求   将完成[...]

方法上的

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

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