ArrayList(线程不安全) ---> CopyOnWriteArrayList(线程安全,读操作时在原有数据上读)
字面意思:写操作时复制。当对ArrayList进行写操作时,它先将原有数组拷贝一份,然后再新的数组上进行写操作,写完之后再将原来的数组指向新的数组。
CopyOnWriteArrayList的add操作都是在锁(如图一,锁的概念可以回顾之前写的)下进行的,这样做是为了在并发操作时复制多个副本输出搞乱数据,导致最终数据不是自己期望的值。
缺点: 因为在写操作时需要拷贝副本,消耗内存。
不能用于事实读的场景,所以适合读多写少的场景。
设计思想: 读写分离,最终一致性,使用时开辟空间,解决并发冲突
其他:
HashSet -> CopyOnWriteArraySet
TreeSet -> ConcurrentSkipListSet
HashMap -> ConcurrentHashMap
TreeMap -> ConcurrentSkipListMap
如何达到共享对象安全
线程限制:一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改
共享只读:一个共享只读的对象,在没有同步的情况下,可以被多个线程并发访问,但不可以修改
线程安全对象:一个线程安全的对象或者容器,在内部通过同步机制来保证线程安全,所以其他线程无需额外的同步就可以通过公共接口随意访问它
被守护对象:被守护对象只能通过获取特定的锁来访问