栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

3g门户(3d试机号)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

3g门户(3d试机号)

集合类之并发修改异常(ArrayList) 并发修改异常演示
    public static void main(String[] args) {
        List list = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{  //java.util.ConcurrentModificationException
                list.add(UUID.randomUUID().toString());
                System.out.println(list);
            }).start();

        }
    }
并发修改异常解决 (Vector)
    public static void main(String[] args) {
        List list = new Vector<>(); // Vector 全部都加了synchronized 锁 导致并发效率低 不推荐
        for (int i = 0; i < 30; i++) {
            new Thread(()->{  
                list.add(UUID.randomUUID().toString());
                System.out.println(list);
            }).start();

        }
    }
并发修改异常解决 (Collections)
public static void main(String[] args) {
        List list = Collections.synchronizedList(new ArrayList<>()); //返回 加了同步锁的集合
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString());
                System.out.println(list);
            }).start();

        }
    }
并发修改异常解决 (写时复制类-推荐)
 public static void main(String[] args) {
        List list = new CopyOnWriteArrayList<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString());
                System.out.println(list);
            }).start();

        }
    }

源码

    
    public boolean add(E e) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }
集合类之并发修改异常(HashSet) 问题演示
 public static void main(String[] args) {
        Set list = new HashSet<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{ //java.util.ConcurrentModificationException
                list.add(UUID.randomUUID().toString());
                System.out.println(list);
            }).start();
        }
    }
问题解决(Collections)
 public static void main(String[] args) {
        Set list = Collections.synchronizedSet(new HashSet<>());//new HashSet<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{ //java.util.ConcurrentModificationException
                list.add(UUID.randomUUID().toString());
                System.out.println(list);
            }).start();
        }
    }
问题解决(CopyOnWriteArraySet)
public static void main(String[] args) {
        Set list =new CopyOnWriteArraySet<>(); //Collections.synchronizedSet(new HashSet<>());//new HashSet<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{ //java.util.ConcurrentModificationException
                list.add(UUID.randomUUID().toString());
                System.out.println(list);
            }).start();
        }
    }
注意

HashSet的底层是HashMap , value 是 object ,并且object 是一个 final 修饰的static 变量
CopyonWriteArraySet 使用的是CopyOnWriteArrayList
HashSet 源码:

	//构造方法
    
    public HashSet() {
        map = new HashMap<>();
    }

//add方法
    
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
// PRESENT 变量定义 //这个就是value 的值

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

CopyOnWriteArraySet源码:

	//构造方法
    
    public CopyOnWriteArraySet() {
        al = new CopyOnWriteArrayList();
    }
    // add 方法
        
    public boolean add(E e) {
        return al.addIfAbsent(e);
    }

//addIfAbsent 方法 这个方法是 CopyonWriteArrayList 的
    
    public boolean addIfAbsent(E e) {
        Object[] snapshot = getArray();
        return indexOf(e, snapshot, 0, snapshot.length) >= 0 ? false :
            addIfAbsent(e, snapshot);
    }

集合类之并发修改异常(haahMap) 问题演示
   public static void main(String[] args) {
        Map list =new HashMap<>(); //Collections.synchronizedSet(new HashSet<>());//new HashSet<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{ //java.util.ConcurrentModificationException
                list.put(Thread.currentThread().getName(),UUID.randomUUID().toString());
                System.out.println(list);
            }).start();
        }
    }
问题解决(Collections)
  public static void main(String[] args) {
        Map list = Collections.synchronizedMap(new HashMap());//new HashSet<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{ //java.util.ConcurrentModificationException
                list.put(Thread.currentThread().getName(),UUID.randomUUID().toString());
                System.out.println(list);
            }).start();
        }
    }
问题解决(Collections)
 public static void main(String[] args) {
        Map list =  new ConcurrentHashMap<>();//Collections.synchronizedMap(new HashMap());//new HashSet<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{ //java.util.ConcurrentModificationException
                list.put(Thread.currentThread().getName(),UUID.randomUUID().toString());
                System.out.println(list);
            }).start();
        }
    }
练习
public class TransferValue {


    public static void main(String[] args) {

        int age = 10;


        changeAge(age);

        System.out.println(age); // 10 


        Persion p = new Persion("zs");

        changeName(p); // changeName

        System.out.println(p.getName());


        String str = "Str";
        changeStr(str);
        System.out.println(str); //Str



    }

    public static void changeName(Persion p){

        p.setName("changeName");
    }

    public static void changeStr(String str){

       str ="changeStr " ;
    }

    public static void changeAge(int  age){

        age = 100;
    }






}
class Persion{

    private int age;

    private String name;

    public Persion(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
//总结 
// 基本类型是值传递
// 对象是引用
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/776098.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号