java Thread(1)

来源:互联网 发布:2016年网络茶叶销售 编辑:程序博客网 时间:2024/06/07 20:54
首先来看一个线程安全的例子,一个无状态的servlet

$ThreadSafe
public  class StatelessFactorizer implements Servlet{
    public void service(ServletRequest req,ServletResponse resp){
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = factor(i);
        encodeIntoResponse(resp,factors);
    }
}

这个例子展示了我们简单的因数费解的Servlet,它从ServletRequest中解包数据,然后将这个数据进行因数分解,最后将结果封包到ServletResponse中。
对于这个例子因为很多人不用讲都知道它是线程安全的,首先得看一下Servlet的工作原理,对于Servlet类中这个service方法是多线程的,也就是说一有客户请求,就会调用这个方法,那么为什么说它是线程安全的。
首先它是无状态的,它不包含域也没有引用其他类的域,通俗来说就是全局变量,一次特定计算的瞬时状态,会唯一的存在本地变量中,这些本地变量存储在线程的栈中,只有执行的线程才能访问,,一个访问StatelessFactorizer的线程,不会影响访问同一个Servlet的其他线程的计算结果,因为两个线程不共享状态,它们如同在访问不同的实例。
因为线程访问无状态对象的行为,(这里的无状态对象我的理解是当前的状态不会受其他线程的影响,它的状态只能受本线程的影响),不会影响其他线程访问该对象时的正确性,所以无状态对象是线程安全的。

原创粉丝点击