1
私はクライアントからの非同期GET呼び出しと1つのPOST要求を持っています。 私のサーブレットがPOSTリクエストを受け取った後、私はGETコールを別の方法で処理したいと思います。ここで私は試みたが、失敗したものです:Java JavaScriptからの非同期呼び出しの同期
public class MyServlet {
private static volatile proceed = true;
public void doGet(req, resp) {
...
doGetAnswer(req, resp);
...
}
public void doPost(req, resp) {
...
doPostAnswer(req, resp);
...
}
public String doGetAnswer(req, resp) {
if (proceed)
return "Answer GET request";
else
return "Do NOT answer GET request";
}
public String doPostAnswer(req, resp) {
proceed = false;
return "POST called, stopping GET requests";
}
}
私の問題は、GET呼び出しによって実行されているスレッドがvolatile変数の変更を認識しないということです。あなたは、プリミティブ型変数の同時読み取り/書き込みがあるとき
proceed.set(false)
でproceed = false;
を交換しif (proceed.get())
で
if (proceed)
を交換しAtomicBoolean proceed = new AtomicBoolean(true)
で
volatile proceed = true
を交換してください:AtomicBoolean
は、トリックを行うもの解決策をどこかで読んでください。あなたは「まれなデザイン」とはどういう意味ですか? –