2016-12-31 7 views
0

私は、J2EE Webフィルタの中で静的メソッドを使用するのが安全かどうか(デッドロックの可能性はありません)、またはインスタンスメソッドを使用すべきなのでしょうか? 私はJ2EE WebFilterフィルタで静的メソッドを使用するのは安全ですか?

Navigation.getLoginURL()

が静的​​メソッドである以下のdoFilterメソッド

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
    HttpServletResponse httpServletResponse = (HttpServletResponse) response; 
    String contextPath = httpServletRequest.getContextPath(); 
    if ((httpServletRequest.getRequestedSessionId() != null && 
      !httpServletRequest.isRequestedSessionIdValid()) || (loginBean == null || loginBean.getUserId() == -1)) { 
     httpServletResponse.sendRedirect(contextPath + Navigation.getLoginURL()); 


    } else { 
     chain.doFilter(request, response); 
    } 
} 

。これはデッドロックにつながる可能性がありますか?

+0

デッドロックは、あるスレッドが他のスレッドによってロックされたリソースを待ってブロックされている場合に発生し、その逆もあります。ここには何もロックされていません。なぜデッドロックが発生するのでしょうか? –

+0

複数の要求が同時にフィルタにヒットしようとしている場合。 – Jim

+0

それでは?彼らはすべてあなたの静的メソッドを同時に実行します。 –

答えて

1

この静的メソッドのポイントは、Filterインスタンスの状態に依存しないことです。ログインURLはアプリケーション全体で同じです。保護すべき状態がないので何もロックする理由はない。

(System.out.printlnのように)ロックする何かに静的メソッドをコールしても、コードがデッドロックすることはありません。 apiサーブレットとフィルタを実装するJava EEコードは、高いレベルの同時実行性をサポートする必要があるため、多くのロックを行う必要はありません。ビューの実装の観点からこれを見ると

は、あなたが安全に呼び出すことができるかを決定するのに役立つ実践でJava並行処理からこの引用を参照してください、セクション4.5.1(曖昧な文書の解釈)する必要があります

あなたは、推測しなければならないだろう。あなたの推測の質を向上させる1つの方法は、単にコンテナやデータベースベンダーなど、それを実装する人の観点から仕様を解釈することです。サーブレットはコンテナ管理のスレッドから常に呼び出されます。複数のスレッドがある場合、コンテナはこれを知っていると想定するのは安全です。サーブレット・コンテナは、HttpSessionやServletContextなど、複数のサーブレットにサービスを提供する特定のオブジェクトを使用可能にします。したがって、サーブレットコンテナは、複数のスレッドを作成し、ServletContextにアクセスすることが合理的に予想されるServlet.serviceのようなメソッドを呼び出すため、これらのオブジェクトを同時にアクセスする必要があります。

これらのオブジェクトが有用である単一スレッドのコンテキストを想像することは不可能なので、明示的にこれを要求していなくてもスレッドセーフであると仮定しなければなりません。また、クライアント側のロックが必要な場合は、クライアント側のコードをどのようにロックする必要がありますか?ドキュメンテーションは言いません、そして、推測するのは不合理なようです。この「合理的な前提」は、ServletContextまたはHttpSessionにアクセスする方法を示し、クライアント側の同期を使用しない仕様および公式のチュートリアルの例によってさらに補強されています。

関連する問題