美文网首页
复合操作---线程安全性

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

作者: 起风了dzj | 来源:发表于2018-07-06 18:36 被阅读0次

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

    相关文章

      网友评论

          本文标题:复合操作---线程安全性

          本文链接:https://www.haomeiwen.com/subject/lppbuftx.html