是一个线程安全的List的实现,通过写时复制机制,在每次修改操作时,复制原数组内容,来保证线程安全
CopyOnWriteArrayList是如何保证线程安全的?
对于读操作,不加锁,读操作操作的是elements数组,这个数组内部是稳定的,不会被修改,所有修改操作,都是复制一份新的数组,在新的数组上进行修改,所以读操作是线程安全的
使用volatile关键字修饰变量(volatile后续细说),使该变量所有线程可见,即修改会立即看到,写入时,会复制一份原数组,在新数组之上修改,这样不会影响到原数组,同时使用volatile关键字修饰elements数组,使写操作对elements数组引用的修改,所有线程可见
对于写操作,加互斥锁,来保证线程安全,这里写不会阻塞读操作,因为读的是原本的element数组,只会阻塞其他线程的写操作
适合读多写少的场景,因为读没有锁,而写需要加锁并且,需要复制一份element数组