【发布时间】:2016-01-04 12:13:32
【问题描述】:
假设如下:
public boolean doThisThing(SomeArg arg) {
if(iAmAllowedToDoIt()) {
doThing(arg);
return true;
} else {
return false;
}
假设 iAmAllowedToDoIt() 是一个非常昂贵的方法,并且 doThisThing() 被许多线程同时调用,并且我可以做任何事情,因为我可以做任何事情,有没有办法批量调用 iAmAllowedToDoIt () 这样我会在并发数据结构中累积 SomeArgs,并在解决 iAmAllowedToDoIt 一次不修改 API 后立即在所有这些上调用 doThing?那个代码会是什么样子?我无法弄清楚如何像这样在不修改 API 的情况下高效地执行多线程批处理。一个理想的答案将包括不依赖于在固定时间段内阻塞来累积 doThisThing() 调用的东西。
理想情况下,它最终会是这样的:
- 调用 doThisThing
- 异步调用 iAmAllowedToDoIt
- 在 (2) 之前对 doThisThing 的所有调用都会重新调用阻塞,直到 (2) 返回
- (2) 返回,如果为 true,则为所有阻塞的 doThisThing()s 调用 doThing
【问题讨论】:
-
你的意思是像缓存
iAmAllowedToDoIt()的结果? -
@RealSkeptic 不,缓存结果是不够的,因为缓存必须在未来某个未知时间失效,此时 iAmAllowedToDoIt() 将返回 false,如果不调用它就无法确定。
-
请不要尝试在 cmets 中放入多行信息或代码。将其添加到问题中。
-
allow方法返回true一次后,什么时候可以再次返回false?
-
它可以随时返回 false 或 true,只是在给定 iAmAllowedToDoIt() 调用期间发生的所有对 doThisThing() 的调用共享 iAmAllowedToDoIt() 的结果
标签: java performance optimization