并发包CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap

一切如你i 码农一号 2022-10-31 17:34:53

并发包

CopyOnWriteArrayList

/*
    ArrayList是线程不安全的,多个线程一起对ArrayList进行操作有可能会有安全问题
    CopyOnWriteArrayList是线程安全的,可以使用它来解决这个问题
 */
public class Task implements Runnable{
    //定义集合【ArrayList是线程不安全的,会引发线程安全问题】
    //List<Integer> list = new ArrayList<>();

    //CopyOnWriteArrayList是线程安全的,可以使用它来解决这个问题
    List<Integer> list = new CopyOnWriteArrayList<>();

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            list.add(i);
        }
        System.out.println("添加完毕");
    }
}
public class Demo01Test {
    public static void main(String[] args) throws InterruptedException {
        //创建Task对象
        Task task = new Task();
        //创建三个线程,并执行任务
        new Thread(task).start();
        new Thread(task).start();
        new Thread(task).start();

        //线程休眠
        Thread.sleep(3000);

        //输出集合的大小
        System.out.println(task.list.size());
    }
}

CopyOnWriteArraySet

public class Demo01Test {
    public static void main(String[] args) throws InterruptedException {
        //创建Task对象
        Task t = new Task();
        //创建线程,启动
        new Thread(t).start();
        //在main线程中向集合中添加2000-3000之间的数字
        for (int i = 2000; i < 3000; i++) {
            Thread.sleep(5);
            t.set.add(i);
        }
        //休眠
        Thread.sleep(7000);
        //输出集合的大小
        System.out.println("集合的大小是:" + t.set.size());
    }
}
/*
    HashSet线程不安全,如果多线程同时对HashSet集合进行操作,有可能会产生安全性的问题
    CopyOnWriteArraySet是线程安全的,我们可以使用这个集合进行多线程操作
 */
public class Task implements Runnable{
    //创建HashSet集合【HashSet线程不安全,如果多线程同时对HashSet集合进行操作,有可能会产生安全性的问题】
    //Set<Integer> set = new HashSet<>();

    //CopyOnWriteArraySet是线程安全的,我们可以使用这个集合进行多线程操作
    Set<Integer> set = new CopyOnWriteArraySet<>();

    @Override
    public void run() {
        //向集合中添加数据
        for (int i = 0; i < 1000; i++) {
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //添加数据
            set.add(i);
        }
        System.out.println("添加完成");
    }
}

ConcurrentHashMap

/*
    HashMap集合不是线程安全的,如果多个线程同时操作HashMap,那么有可能会引发线程安全问题。
    Hashtable集合是线程安全的,多个线程同时操作hashtable不会引发线程安全问题,效率非常低,目前基本已经淘汰了。
    ConcurrentHashMap集合是线程安全的,但是效率相对Hashtable要高。 

 */
public class Task implements Runnable{
    //创建Map集合
    Map<String, String> map = new ConcurrentHashMap<>();

    @Override
    public void run() {
        //定义循环,在循环中向Map集合中添加10000条数据
        for (int i = 0; i < 10000; i++) {
            //向map集合中添加数据
            map.put(Thread.currentThread().getName() + i, Thread.currentThread().getName() + i);
        }
    }
}
public class Demo01Test {
    public static void main(String[] args) throws InterruptedException {
        //创建Task对象
        Task task = new Task();
        //创建三个线程对象,执行任务
        new Thread(task).start();
        new Thread(task).start();
        new Thread(task).start();
        //线程休眠
        Thread.sleep(3000);
        //输出map集合的大小
        System.out.println(task.map.size());
    }
}
...全文
333 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

7,005

社区成员

发帖
与我相关
我的任务
社区描述
阿丹的社区,分享工作日常,和业务技能点,认真写好每一篇文章,共同探讨,共同进步,成就一亿技术人,欢迎大家加入。
htmljavaidea 个人社区 北京·海淀区
社区管理员
  • 一切如你i
  • scdn_wyy
  • 孙阿哈
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

在这里,你可以:

  1. 看到大家丰富多彩的业务多样性。
  2. 浏览各大网站的精彩推荐和分享。
  3. 得到社区最好的资源。
  4. 参与更好的进行社区运营的交流和互动。

 

欢迎你入住阿丹社区云,开始打造属于你的技术社区。

试试用AI创作助手写篇文章吧