【发布时间】:2013-02-10 17:26:43
【问题描述】:
让我们考虑一个具有以下特征的第三方类A:
它的大部分实现是私有的并且相当复杂,因此可以扩展但不能合理修改。
-
A有一个 非常 昂贵的构造函数,应该 永远 被不必要地调用 - 在我的例子中,它构建了一个 huge 数据查找表供以后使用。这意味着创建一个decorator class 来替代
A是不可能的,因为任何装饰器都必须从A继承并调用其构造函数。 -
A被第三方代码使用,因此不能使用 proxy class 代替它 - 其他代码需要A的实例,这就是它应该得到的。 -
A提供了一堆非常昂贵的报告方法,frabble很多wrabbles来生成一堆报告。 p>这些方法不会产生任何本地使用的结果 - 它们理论上可以是异步的,但不幸的是它们不是。
A的方法互相调用 - 很多。A实现是不透明的,并且在不断变化 - 像使用反射后实例化这样的黑客攻击,例如瘦身是不可能的。A不是线程安全的 - 不是真的...
我达到了A 成为我项目中的瓶颈的地步,所以我创建了一个子类B 希望推动wrabbles 的实际frabbling > 到一个单独的线程。我覆盖了A 的所有公共方法,只将Runnable 对象提交给单线程执行器服务。每个Runnable 然后从工作线程执行适当的super 方法。
不幸的是,A经常调用自己的公共方法。通常这不是问题,但在我的情况下,超类正在调用来自B 的方法。这是一个主要问题,因为B 方法延迟实际执行并将新任务提交给执行器服务,从而导致性能和正确性问题。
我的解决方案是检查 Thread.currentThread() 在来自 B 的所有方法中的结果,以便来自工作线程的调用将直接委托给 super 方法,而不是作为新任务提交。
所以现在我正处于 Thread.currentThread() 已成为性能问题的地步,这可能是因为它是一种过于频繁调用的本机方法。
是否有更快的方法以线程安全的方式检查源自超类和/或工作线程的方法调用?
是否有替代设计可以让我将
A的frabbling wrabbles 推送到另一个线程?在我看来,由于A是第三方代码,我大多被困...
【问题讨论】:
-
什么是“本地使用的结果”(本地到什么?),这与异步有什么关系(您的意思是线程安全的吗?)
-
@meriton:我的意思是报告方法调用是即发即弃的。我不必等待他们完成...
-
Thread.currentThread()速度很快,怎么会有问题?特别是它在所谓的非常昂贵的操作之前被调用一次,它不应该被注意到。 -
@irreputable:问题是非常昂贵的操作调用了
A中的其他公共方法数千次。由于这些方法也被其他类使用,我不能直接委托给super- 我必须检查调用是否应该提交给工作线程。
标签: java multithreading performance inheritance