pan*_*ajt 2 java performance multithreading
class ApplicationContext{
private final NetworkObject networkObject = new networkObject();
public ApplicationContext(){
networkObject.setHost("host");
networkObject.setParams("param");
}
public searchObjects(ObjectType objType){
networkObject.doSearch(buildQuery(objType));
}
}
class NetworkObject{
private final SearchObject searchObject = new SearchObject();
public doSearch(SearchQuery searchQuery){
searchObject.search(searchQuery); //threadsafe, takes 15(s) to return
}
}
Run Code Online (Sandbox Code Playgroud)
考虑运行Web应用程序的Web服务器,该Web应用程序仅创建一个ApplicationContext实例(单例)并使用相同的applicationInstance来调用searchObjects,例如
ApplicationContext appInstance =
ApplicationContextFactory.Instance(); //singleton
Run Code Online (Sandbox Code Playgroud)
每个对网页的新请求都说"search.jsp"会拨打电话
appInstance.searchObjects(objectType);
Run Code Online (Sandbox Code Playgroud)
我正在向'search.jsp'页面发出1000个请求.所有线程都使用相同的ApplicationContext实例,而searchObject.search()方法需要15秒才能返回.我的问题是当一个人已经在执行searchObject.search()函数或所有线程同时执行searchObject.search()时,所有其他线程是否等待轮到他们执行(15秒),为什么?
我希望我的问题非常明确?
更新: 感谢大家澄清我的疑问.这是我的第二个问题,当我这样做时应该观察到性能的差异:
public synchronized doSearch(SearchQuery searchQuery){
searchObject.search(searchQuery); //threadsafe, takes 15(s) to return
}
Run Code Online (Sandbox Code Playgroud)
要么
public doSearch(SearchQuery searchQuery){
searchObject.search(searchQuery); //threadsafe, takes 15(s) to return
}
Run Code Online (Sandbox Code Playgroud)
我相信使用没有synchronized关键字的'doSearch'功能应该可以提供更多性能.但是,当我今天测试它时,结果却出现了另一种情况.当我使用synchronized关键字时,性能相似或有时更好.
谁能解释这种行为.我应该如何调试这种情况.
问候,
佩里
那么你没有在代码中指定任何同步,所以没有任何其他证据我怀疑所有线程将同时运行.如果SearchObject.search包含一些同步,那么这显然会限制并发性.
请注意,您的JSP容器可能正在使用线程池来为1000个请求提供服务,而不是创建1000个线程.
编辑:至于为什么它可能更快synchronized:有时并发实际上并没有帮助吞吐量.上下文切换,磁盘瓶颈,缓存未命中等等都会产生这种影响.这通常不是有更多的运行的线程比内核是个好主意.
对于一个真实的例子,假设你有一千个购物者都想从一个相当小的商店买东西.你会怎么做?将所有1000个同时放入商店,或者在任何时间将其保持在商店中相当小的数量,并在外面排队?