我们将“先检查后执行”以及“读取-修改-写入"等操作统称为符合操作:包含了一组必须以原子方式执行的操作以确保线程安全性。后面我们会讨论加锁机制,这是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)来管理类的状态。 与非线程安全的对象相比,判断线程安全对象的可能状态及其状态转换情况要更为容易,从而也更容易维护和验证线程安全性。