【发布时间】:2011-04-30 08:48:57
【问题描述】:
考虑一下
public Object doGet() {
return getResource();
}
private Object getResource() {
synchronized (lock) {
if (cachedResourceIsStale()) {
downloadNewVersionOfResource();
}
}
return resource;
}
假设doGet 将同时执行,并且执行很多,并且下载新版本的资源需要一段时间,有没有更有效的方法来在getResource 中进行同步?我知道读/写锁,但我认为它们不能在这里应用。
为什么要同步?如果缓存过时,所有访问资源的线程仍在第一个刷新时,将执行它们自己的刷新。除了这导致的其他问题,它几乎没有效率。
正如 BalusC 在 cmets 中提到的,我目前在 servlet 中面临这个问题,但我对通用答案很满意,因为谁知道在什么情况下我会再次遇到它。
【问题讨论】:
-
您可以划分页面并重新加载特定部分,而不是重新获取整个页面
-
您已经编辑了代码以中和 Servlet API,但重要的是要知道这发生在 servlet 中,所以我添加了标记。
-
定义“很多”;每秒调用多少次? cachedResourceIsStale() 需要多长时间?
-
如果 doGet() 在 servlet 中针对 HTTP GET 请求运行,并且 write() 修改了资源,那么您就误用了 HTTP。您应该只修改 POST、PUT 和 DELETE 请求中的资源。编辑添加:在 HTTP 服务器的上下文中,单个同步调用可能不值得优化。只在测量后优化,绝不过早。
-
@Spike:不,
write()写入响应。 OP过度简化了这个例子。查看原始代码的问题编辑历史记录。
标签: java multithreading servlets synchronization locking