我有一个名为Statelessservlet的servlet,它每次都会实例化一个新的stafeful对象。我是否需要为此有状态对象提供同步?
以下是代码:
public class StatelessServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
StatefulObject stObj = new StatefulObject(Integer.parseInt(req.getParameter("id")));
stObj.performSomeStatefulOperation();
...
}
}
class StatefulObject {
private int id;
public StatefulObject(int id) {
this.id = id;
}
//Is synchronized really needed here???
public synchronized void performSomeStatefulOperation() {
id++;
}
}
根据Brian Grotz JCIP,每个stafeful对象都应该同步,所以理想情况下我们应该同步这个方法吗?
答案 0 :(得分:4)
不需要同步,因为每个线程都有自己的StatefulObject实例,而其他线程无法访问它。
答案 1 :(得分:4)
如果与服务器的每次交互都创建了一个新对象并将其丢弃,那么不进行同步是相对安全的(同时访问该服务的多个线程之间没有共享状态)。
另一方面,如果重用这些对象,则必须同步该方法。
此外,例如,如果您的performSomeStatefulOperation
更改了某些共享数据的状态,那么您应该同步它,除非您采取其他步骤来保证其线程安全(例如,使用锁)。
总结一下,这取决于你在方法中做了什么。从你所展示的内容来看,没有必要,如果该方法的多次调用可能存在问题(因为它更新了共享状态),那么你应该同步它。