为什么多线程似乎没有加速我的Web应用程序?

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关键字时,性能相似或有时更好.

谁能解释这种行为.我应该如何调试这种情况.

问候,

佩里

Jon*_*eet 5

那么你没有在代码中指定任何同步,所以没有任何其他证据我怀疑所有线程将同时运行.如果SearchObject.search包含一些同步,那么这显然会限制并发性.

请注意,您的JSP容器可能正在使用线程池来为1000个请求提供服务,而不是创建1000个线程.

编辑:至于为什么它可能更快synchronized:有时并发实际上并没有帮助吞吐量.上下文切换,磁盘瓶颈,缓存未命中等等都会产生这种影响.这通常不是有更多的运行的线程比内核是个好主意.

对于一个真实的例子,假设你有一千个购物者都想从一个相当小的商店买东西.你会怎么做?将所有1000个同时放入商店,或者在任何时间将其保持在商店中相当小的数量,并在外面排队?