复合操作

我们将“先检查后执行”以及“读取-修改-写入"等操作统称为符合操作:包含了一组必须以原子方式执行的操作以确保线程安全性。后面我们会讨论加锁机制,这是Java中用于确保原子性的内存机制,我们还可以使用一个现有的线程安全类:

public class CountingFactorizer implements Servlet{
    private final AtomicLong count=new AtomicLong(0);
    
    public long getCount(){return count.get();}

    public void service(ServletRequest req,ServletResponse resp){
        BigInteger i=extractFromRequest(req);
        BigInteger[] factors=factor(i);
        count.incrementAndGet();
        encodeIntoResponse(resp,factors);
    }

}

  在java.util.coucurrent.atomic包中包含了一些原子变量类,用于实现在数值和对象引用上的原子状态转换。通过用AtomicLong来代替long类型的计数器,能够确保所有对计数器状态的访问操作都是原子的。由于Servlet的状态就是计数器的状态,并且计数器是线程安全的,因此这里的Servlet也是线程安全的。

   在实际情况中,应尽可能地使用现有的线程安全对象(如AtomicLong)来管理类的状态。 与非线程安全的对象相比,判断线程安全对象的可能状态及其状态转换情况要更为容易,从而也更容易维护和验证线程安全性。

猜你喜欢

转载自dbp5588.iteye.com/blog/2368570
今日推荐