并发容器及安全共享策略(J.U.C)
ArrayList-CopyOnWriteArrayList
CopyOnWriteArrayList,写操作复制在新数组上进行写的操作写完之后把原来的数组指向新的数组,整个写操作都是在锁的保护下进行的,这么做为了在多线程并发的情况下复制出多个副本出来把数据搞乱了
缺点:写操作的时候需要拷贝数组,消耗内存,如果愿数组内容比较多的时候会有gc问题,2、不能用于实时读的场景,这里比如拷贝数组新增元素都需要时间,虽然能满足最终一致性但是无法满足实时性,因此CopyOnWriteArrayList更适合读多写少的场景,设计思想是读写分离、最终一致性、使用时另外开辟空间,读操作都是在原数组上读不需要加锁,写操作需要加锁,避免并发时多个线程同时修改
HashSet、TreeSet->CopyOnWriteArraySet、ConcurrentSkipListSet
HashMap、TreeMap->ConcurrentHashMap、ConcurrentSkipListMap
ConcurrentHashMap不能为空,在类对于读操作做了大量优化,就有特别高的并发性
ConcurrentSkipListMap是有序的,支持更高的并发,存取时间和线程数无关的,在数据量一定的情况下并发的线程越多ConcurrentSkipListMap越能体现出优势,非多线程下尽量使用TreeMap,对并发性较低也可使用Collections里面的类,对于高并发程序应该使用ConcurrentSkipListMap提供更高的并发度
实例
//请求总数
private static int clientTotal=5000;
//同时并发请求的线程数
private static int threadTotal=200;