2012-07-14 83 views

回答

22

你的问题归结为:呼吁从多个线程的方法相同的对象是线程安全的。答案是:它取决于。如果你的对象(让它是servlet)是无状态的或只有final字段,这是完全线程安全的。局部变量和参数是线程本地的(驻留在堆栈上,而不是堆上)。

另外,每个service()调用接收不同的ServletRequestServletResponse的实例。然而这里是不安全的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; 
} 

AtomicInteger

private AtomicInteger counter = new AtomicInteger(); 

//... 
counter.incrementAndGet(); 

在这种特殊情况下AtomicInteger好得多正弦e它使用CAS CPU操作无锁,​​是互斥锁。

+0

@ Tomasz你可以在这里发表一个简短的例子,你可以证明你有一个简单的servlet和2个不同的浏览器,你正在提出请求,并通过一个线程故意改变值。这件事我想看.. ..在此先感谢 – user1508454 2012-07-14 16:50:23

+0

伟大的人,请问你现在如何保护柜台,并通过同步会影响性能,请你也请解释一点关于原子整数 – user1508454 2012-07-14 16:54:31

+0

@ user1508454:查看我的更新 – 2012-07-14 17:00:10