Java 这里需要同步吗?
我有一个名为无状态servlet的servlet,它每次都实例化一个新的有状态对象。我是否需要提供此有状态对象的同步 代码如下:Java 这里需要同步吗?,java,concurrency,Java,Concurrency,我有一个名为无状态servlet的servlet,它每次都实例化一个新的有状态对象。我是否需要提供此有状态对象的同步 代码如下: public class StatelessServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IO
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,每个有状态的对象都应该同步,所以理想情况下我们应该同步这个方法 不需要同步,因为每个线程都有自己的StatefulObject实例,其他线程无法访问该实例。如果与服务器的每次交互都创建一个新对象并丢弃它,那么不进行同步是相对安全的(同时访问服务的多个线程之间没有共享状态) 另一方面,如果重用了这些对象,则必须同步该方法 此外,例如,如果您的
performSomeStatefulOperation
更改了某些共享数据的状态,那么您应该同步它,除非您采取其他步骤来保证它的线程安全(例如使用锁)
总之,这取决于您在方法中所做的事情。从您展示的情况来看,如果多次调用该方法可能会出现问题(因为它会更新共享状态),则没有必要这样做,然后你应该同步它。我想收回我的投票,但不知道如何进行。
根据Brian Grotz JCIP,每个有状态对象都应该同步。
false-Goetz描述了多种其他技术,如线程限制、原子变量的使用等。