Java 同步来自 Java 脚本的异步调用
Java synchronize asynchronous calls from JavaScript
我有很多来自客户端的异步 GET 调用和一个 POST 请求。
在我的 servlet 收到 POST 请求后,我想以其他方式处理即将到来的 GET 调用。这是我尝试但失败的方法:
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 变量的变化。
非常不常见的设计...
无论如何,当你有一个原始类型变量的并发read/write时,你可能想要使用 Atomic* 数据类型。
AtomicBoolean
应该可以解决问题:
将volatile proceed = true
替换为AtomicBoolean proceed = new AtomicBoolean(true)
将if (proceed)
替换为if (proceed.get())
将proceed = false;
替换为proceed.set(false)
我有很多来自客户端的异步 GET 调用和一个 POST 请求。 在我的 servlet 收到 POST 请求后,我想以其他方式处理即将到来的 GET 调用。这是我尝试但失败的方法:
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 变量的变化。
非常不常见的设计...
无论如何,当你有一个原始类型变量的并发read/write时,你可能想要使用 Atomic* 数据类型。
AtomicBoolean
应该可以解决问题:
将volatile proceed = true
替换为AtomicBoolean proceed = new AtomicBoolean(true)
将if (proceed)
替换为if (proceed.get())
将proceed = false;
替换为proceed.set(false)