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
}
}
1つのApplicationContextインスタンス(シングルトン)を作成し、同じapplicationInstanceを使用してsearchObjectを呼び出すWebアプリケーションを実行しているWebサーバーを考えてみましょう。複数のスレッドがWebアプリケーションを高速化するように見えないのはなぜですか?
ApplicationContext appInstance =
ApplicationContextFactory.Instance(); //singleton
Webページへのすべての新しい要求が 'search.jsp' と言う私は 'search.jsp' のページに1000の要求を作っていますコール
appInstance.searchObjects(objectType);
になります。すべてのスレッドが同じApplicationContextインスタンスを使用しています。また、searchObject.search()メソッドは15秒かかるので返します。私の質問は、他のすべてのスレッドがsearchObject.search()関数を実行しているとき、またはすべてのスレッドが同時にsearchObject.search()を同時に実行しているときに、そのターン(15秒)が実行されるのを待ちますか?
私は私の質問を非常に明確にしたいと思っていますか?
更新: ご迷惑をおかけしていただきありがとうございます。
public synchronized doSearch(SearchQuery searchQuery){
searchObject.search(searchQuery); //threadsafe, takes 15(s) to return
}
OR
public doSearch(SearchQuery searchQuery){
searchObject.search(searchQuery); //threadsafe, takes 15(s) to return
}
私は同期キーワードを指定せずに関数「doSearch」を使用して、よりパフォーマンスを与えるべきであると考えている。ここに私の2番目の質問は、私が行うときに観察されなければならない性能にどのような違いであり、 。しかし、私が今日それをテストしたとき、結果は逆になりました。同期されたキーワードを使用すると、パフォーマンスは似ています。
誰でも行動を説明できますか?そのようなケースをどのようにデバッグするべきですか?
よろしく、
ペリー
上記の私の更新を見てください! – pankajt