【问题标题】:Regarding thread safety of servlet [duplicate]关于servlet的线程安全[重复]
【发布时间】:2012-07-14 04:33:06
【问题描述】:

可能重复:
How do servlets work? Instantiation, session variables and multithreading

servlet 是线程安全的吗?例如,如果我打开 5 个不同的浏览器并向容器中的一个 servlet 发送请求,它是否仍然是线程安全的,我指的是 service() 方法

【问题讨论】:

    标签: java multithreading servlets thread-safety


    【解决方案1】:

    您的问题归结为:从同一个对象线程安全的多个线程调用方法。答案是:视情况而定。如果您的对象(让它成为 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 变量,因此必须以某种方式对其进行保护:要么使用synchronizedvolatile 不够):

    synchronized(this) {
        ++counter;
    }
    

    AtomicInteger:

    private AtomicInteger counter = new AtomicInteger();
    
    //...
    counter.incrementAndGet();
    

    在这种特殊情况下,AtomicInteger 要好得多,因为它使用 CAS CPU 操作是无锁的,而 synchronized 是互斥体。

    【讨论】:

    • @Tomasz.can you post here一个简短的例子,你可以证明你有一个简单的servlet,你正在使用2个不同的浏览器发出请求,并通过一个线程故意改变值.这东西我想看..!!提前谢谢
    • 好人,请问您现在将如何保护计数器,同步是否会影响性能,您能否还请您解释一下有关原子整数的信息
    • counter 将是共享对象,因此每个使用此 servlet 的成员都将拥有相同的 counter 对象
    猜你喜欢
    • 2016-08-24
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多