7
可能重复:
How do servlets work? Instantiation, session variables and multithreading关于线程安全
是的servlet是线程安全的..?对于前如果我打开5级不同的浏览器,并在容器发送请求到一个servlet中,它仍然是线程安全的,我指的service()
方法特别
可能重复:
How do servlets work? Instantiation, session variables and multithreading关于线程安全
是的servlet是线程安全的..?对于前如果我打开5级不同的浏览器,并在容器发送请求到一个servlet中,它仍然是线程安全的,我指的service()
方法特别
你的问题归结为:呼吁从多个线程的方法相同的对象是线程安全的。答案是:它取决于。如果你的对象(让它是servlet)是无状态的或只有final
字段,这是完全线程安全的。局部变量和参数是线程本地的(驻留在堆栈上,而不是堆上)。
另外,每个service()
调用接收不同的ServletRequest
和ServletResponse
的实例。然而这里是不安全的servlet的示例:
public class UnsafeServlet implements Servlet {
private int counter;
public void init(ServletConfig config) throws ServletException {
}
public void service(ServletRequest request, ServletResponse response)
++counter;
}
public void destroy() {
}
}
由于多个线程可以访问counter
变量,它具有以某种方式固定:或者通过使用(volatile
是不够的):
synchronized(this) {
++counter;
}
private AtomicInteger counter = new AtomicInteger();
//...
counter.incrementAndGet();
在这种特殊情况下AtomicInteger
好得多正弦e它使用CAS CPU操作无锁,是互斥锁。
@ Tomasz你可以在这里发表一个简短的例子,你可以证明你有一个简单的servlet和2个不同的浏览器,你正在提出请求,并通过一个线程故意改变值。这件事我想看.. ..在此先感谢 – user1508454 2012-07-14 16:50:23
伟大的人,请问你现在如何保护柜台,并通过同步会影响性能,请你也请解释一点关于原子整数 – user1508454 2012-07-14 16:54:31
@ user1508454:查看我的更新 – 2012-07-14 17:00:10