2016-05-25 12 views
0

CheckURLという名前のサーブレットがinitメソッドのXMLファイルからデータを読み込み、このXMLのノードリストをservletcontextに配置するWebアプリケーションを作成しています。したがって、このサーブレットに要求されるたびに、xmlから何度も何度もデータを読み取る必要はありません。サーブレットコンテキストからノードリストを取得できます。 xmlを更新するために使用されるアプリケーションには別のサーブレットがあり、xmlが更新されるとservletcontextノードリ変数を更新します。サーブレットのコンテキスト属性を安全に設定する

このシナリオでは、xmlに書き込むときにservletcontextノードリストからの読み取りがブロックされるように同期を取っていきたいと思います。それが最新でないデータを読み込んでいる可能性があります。

これを達成するには、どの同期レベルを使用する必要があるのでしょうか。私はservletcontextオブジェクトで同期する必要がありますか、またはサーブレットコンテキストで設定された要素に対して同期する必要がありますか、サーブレットクラスのインスタンスで同期する必要があります。あなたは何ができるか

+0

「ServetContext」を同期させます。 – EJP

+0

@EJP私は、サーブレットコンテキストで同期すると、私の見解ではアプリケーションが遅くなるのではないかと疑問に思っています。 servletcontextオブジェクトは他のサーブレットでも使用されている可能性があるため、ノードリストに対する読み取り操作や書き込み操作は、サーブレットコンテキストに格納されている他の変数への読み書きをブロックすべきではありません。 – KItis

+1

あなたはこれを考えすぎています。同期されたブロックで費やされた時間だけで、同じことで同期しているアプリケーションの部分だけが表示されます。コンテキスト変数を更新するのにどれくらい時間がかかりますか? – EJP

答えて

1

同期スコープは、パフォーマンス上の理由からできるだけ小さくすることをお勧めします。コードのチャンクが少ないほど、実行時間が短縮され、他のスレッドが待機する時間が短くなります。

この場合、nodeListレベルで同期する必要があります。ノードリストを含むCollections.synchronizedListを使用できます。これは、アトミック操作のためのすべての同期作業を行います。ただし、リスト上で複数の操作を1つのアトミック操作として実行するには、明示的な同期が必要です。たとえば、読み書きするときなどです。コード例hereを探します。

+0

はい、私はあなたが私に説明したことを明確にしようとしていました。すばらしいです! – KItis

1

は、このクラスで起こっているノードリストオブジェクトへとServetContext

のうちアクセスの周りにスレッドセーフなラッパーであるクラスは

java.util.concurrent.locks.ReentrantReadWriteLock 
を利用することができます持っています

は、ノードリストの読み取りと書き込みだけをロックします。ノート

public class ThreadSafeAccessToNodeList 
{ 
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); 

    private final Lock readLock = readWriteLock.readLock(); 
    private final Lock writeLock = readWriteLock.writeLock(); 

    public NodeList read (ServetContext sc) 
    { 
     readLock.lock(); 
     NodeList nl = null; 
     try 
     { 
      // get the node list 
      nl = (NodeList) sc.getAttribute("node_list"); 
     } 
     finally 
     { 
      readLock.unlock(); 
     } 
     return nl; 
    } 

    public void write (ServetContext sc, Object newData) 
    { 
     writeLock.lock(); 
     try 
     { 
      // get the node list 
      NodeList nl = (NodeList) sc.getAttribute("node_list"); 

      // modify the node list with the new data 
     } 
     finally 
     { 
      writeLock.unlock(); 
     }  
    } 
} 

:詳細readLocks writeLocksに比べて 必要がある場合に

  • これはまた、全体ServetContext
  • に同期しないという利点があり、このロックは、最高の性能が得られます。
関連する問題