Struts2のスレッドの安全性について話す前に、まずスレッドの安全性とは何かについてお話しましょう。これはネチズンが言ったことです。
あなたのコードがあなたがいるプロセスにある場合、同時に複数のスレッドが実行され、これらのスレッドはこのコードを同時に実行する場合があります。各実行の結果が単一のスレッド実行の結果と同じであり、他の変数の値が予想と同じである場合、それはスレッドセーフです。
つまり、プロセスでは、複数のスレッドが同時に実行されます。各スレッドの実行中、変数値は同じであり、実行結果は同じであり、スレッドセーフです。それ以外の場合、スレッドは安全ではありません。
次に、サーブレットのスレッド安全性の問題を確認します。サーブレットはシングルトンモードであるため、1つのインスタンスのみが生成されます。複数のユーザーが同時にサーブレットを要求すると、Tomcatは複数のスレッドを導出してサーブレットコードを実行します。したがって、サーブレットはスレッドセーフです。不適切に使用すると、問題が発生する可能性があります。これが例です:
package com.wang.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;publicクラススレッドセーブレットはhttpservlet {private string name; // public private variable name public void doget(httpservletrequest request、httpservletresponse応答)を定義します。 // request field field name = request.getParameter( "name")から名前属性を取得します。 //スレッドを10秒間眠らせてください{thread.sleep(10000); } catch(arturnedexception e){e.printstacktrace(); } // browser応答への出力名値。getwriter()。print( "name ="+name); }}2つのブラウザを使用して、threadsafeservlet?name = "zhangsan"とthreadsafeservlet?name = "lisi"に10秒以内にアクセスします。結果はどちらもname = lisiです。つまり、プログラムに問題があることを意味します。マルチスレッドの同時読み取りと書き込みは、同期からのデータにつながります。したがって、サーブレットを使用する場合、グローバルプライベート属性を定義するのではなく、それぞれdoget()とdopost()メソッドに変数を定義します。もちろん、それが単なる読み取り操作である場合、問題はありません。したがって、サーブレットのグローバルな読み取り専用属性を定義する場合は、最終タイプを定義するのが最善です。
struts2のアクションは、各要求のインスタンスを作成します。アクションクラスと通常のJavaクラスに違いはなく、同期からデータがないため、スレッドセーフです。
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。