并发下的集合不安全--list\set\map
并发下的list不安全--- CopyOnWriteArrayList/Vector
*List
*方案1:List
*方案2:List
*方案3:List
CopyOnWriteArrayList 比 vector 好在哪里?
Vector 的曾删改查方法都加上了synchronized锁,保证同步的情况下,因为每个方法都要去获得锁,所以性能就会大大下降。
CopyOnWriteArrayList 方法只是在增删改方法上增加了ReentrantLock锁,但是他的读方法不加锁,所以在读的方面就要比Vector性能要好,
CopyOnWriteArrayList适合读多写少的并发情况,读写分离,在写的时候复制出一个新的数组,完成插入、修改、删除操作,在完成操作后,将这个新的数组赋值给一个array。
并发下的集合不安全--list
package unsafe;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
/**
 * CopyOnWriteArrayList---Vector
 * ConcurrentModificationException 并发修改异常
 *
 * @author liu
 */
public class ListTest {
    public static void main(String[] args) {
        //并发下,arraylist不安全的
        /*解决方案
         *List<String> list = new ArrayList<>(); ---->ConcurrentModificationException 并发修改异常
         *方案1:List<String> list = new Vector<>();
         *方案2:List<String> list = Collections.synchronizedList(new ArrayList<>());
         *方案3:List<String> list = new CopyOnWriteArrayList<>();
         */
        //CopyOnWrite 写入时复制 cow 计算机的程序设计领域的一种优化策略
        //多个线程调用的时候,list,读取的时候固定的,写入覆盖
        //在写入的时候避免覆盖,改造成数据问题!
        //CopyOnWriteArrayList 比 vector 好在哪里?
        //Vector 的曾删改查方法都加上了synchronized锁,保证同步的情况下,因为每个方法都要去获得锁,所以性能就会大大下降。
        //CopyOnWriteArrayList 方法只是在增删改方法上增加了ReentrantLock锁,但是他的读方法不加锁,所以在读的方面就要比Vector性能要好,
        //CopyOnWriteArrayList适合读多写少的并发情况,读写分离,在写的时候复制出一个新的数组,完成插入、修改、删除操作,在完成操作后,将这个新的数组赋值给一个array。
        List<String> list = new CopyOnWriteArrayList<>();
        for (int i = 1; i <= 10; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 1));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
        ;
    }
}
并发下的集合不安全--set
package unsafe;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;
/**
 * ConcurrentModificationException 并发修改异常
 *
 * @author liu
 */
public class SetTest {
    public static void main(String[] args) throws InterruptedException {
        //方案1:   Set<String> set = Collections.synchronizedSet(new HashSet<>());
        //方案2:   Set<String> Set = new CopyOnWriteArraySet<>();
        Set<String> set = new CopyOnWriteArraySet<>();
        for (int i = 1; i <= 30; i++) {
            new Thread(() -> {
                set.add(UUID.randomUUID().toString().substring(0, 4));
                System.out.println(set);
            }, String.valueOf(i)).start();
        }
    }
}
并发下的集合不安全--map
package unsafe;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class MapTest {
    public static void main(String[] args) {
        //map 是这样用的吗?不是,工作中不用HashMap
        // 默认等价于什么?new HashMap<>(16,0.75);
        // Map<String, String> map = new HashMap<>();有问题
        //研究concurrentHashMap的原理
        //方案一:Map<String, String> Map= Collections.synchronizedMap(new HashMap<>());
        //方案二:
        Map<String, String> map =new ConcurrentHashMap<>();
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 4));
                System.out.println(map);
            },String.valueOf(i)).start();
        }
    }
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号