zoukankan      html  css  js  c++  java
  • copyonwrite 写时复制

    java学习者都清除arraylist并不是线程安全的,在读线程读取arraylist的时候,如果有写线程在写数据的时候,基于fast-fail机制,会抛出concurrentmodificationexception异常,也就是说arraylist并不是一个线程安全的容器,当然可以用vector,或者是collections的静态方法将arraylist包装成一个线程安全的类,但是这些方式都是采用java关键字synchronized方法对方法进行修饰,利用独占式锁保证线程安全。但是独占式锁在同一时刻只有一个线程安全能够获取到对象监视器,很显然这种效率不是最高的。

    回到业务场景中,很多业务往往是读多写少,比如系统配置的信息,除了在初始进行系统配置的时候需要写入数据,其他大部分时刻其他模块只对系统信息值需要进行读取,又比如白名单,黑名单等配置,他们都是属于读多写少的场景。如果在这种情况下用到上述的方法,使用vector、collections转换的这些方式是不合理的。因为尽管多个读线程从同一个数据容器中读取数据,但是读线程对数据容器的数据并不会发生修改。自然而然的我们会联想到ReenTrantReadWriteLock(读写锁),通过读写分离的思想,使得读读之间不会阻塞,无疑如果一个list能够做到被多个线程读取的话,性能会达达提升不少,但是如果仅仅是将list通过读写锁(ReentrantReadWriteLock)进行再一次的封装的话,由于读写锁的特性,当写锁被写线程获取后,读写线程都会被阻塞。如果仅仅使用读写锁对list进行封装的话,这里仍然存在读线程在读数据的时候被阻塞的情况,如果想list的读效率更高的话,这里就是我们的突破口,如果我们保证读线程无论什么时候都不被阻塞,效率岂不是会更高?
    Doug Lea大师就为我们提供CopyOnWriteArrayList容器可以保证线程安全,保证读读之间在任何时候都不会被阻塞,CopyOnWriteArrayList也被广泛应用于很多业务场景之中

    链接:https://www.jianshu.com/p/24ae1d6e3ce0

  • 相关阅读:
    redis学习汇总
    注解配置springMVC
    为什么MYSQL分页时使用limit+ order by会出现数据重复问题
    springMVC请求访问的整个过程
    springMVC项目配置文件
    springMVC三大组件、spring主要jar包、
    单例模式的三种实现方式
    JDBC连接数据库的7个步骤
    数据结构汇总
    Java基础汇总2019
  • 原文地址:https://www.cnblogs.com/nineberg/p/13530799.html
Copyright © 2011-2022 走看看