复合操作---线程安全性

假定有两个操作A和B,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,那么A和B对彼此来说是原子的。原子操作是指,对于访问同一个状态的所有操作(包括该操作本身)来说,这个操作是一个以原子方式执行的操作。

@ThreadSafe

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();//以原子方式将当前值加 1。

encodeIntoResponse(resp,factors);

}

}

在java.util.concurrent.atomic 包中包含了一些原子变量类,用于实现在数值和对象引用上的原子状态转换。通过用AtomicLong来替换Long类型的计算器,能够确保所有对计数器状态的访问操作都是原子的。

AtomicLong是作用是对长整形进行原子操作,显而易见,在java1.8中新加入了一个新的原子类LongAdder,该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAdder有着更高的性能和更好的表现,可以完全替代AtomicLong的来进行原子操作。

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

你可能感兴趣的:(复合操作---线程安全性)