假定有两个操作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)来管理类的状态。与非线程安全的对象对比,判断线程安全对象的可能状态及其状态转换情况要更为容易,从而也更容易维护和验证线程安全性。
网友评论