iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java JUC中如何操作List安全类的集合
  • 818
分享到

Java JUC中如何操作List安全类的集合

2023-06-20 13:06:52 818人浏览 泡泡鱼
摘要

小编给大家分享一下Java JUC中如何操作List安全类的集合,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!不安全的集合在单线程应用中,通常采取new ArrayList(),指定一个List集合,用于存放可重复的数据。

小编给大家分享一下Java JUC中如何操作List安全类的集合,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

不安全的集合

在单线程应用中,通常采取new ArrayList(),指定一个List集合,用于存放可重复的数据。

但在多线程下,往往会出现意想不到的问题,代码如下所示:

import java.util.*;public class ListTest {    public static void main(String[] args) throws InterruptedException {        // 创建list集合        //List<String> lists = Arrays.asList("1", "2", "3");        // 不安全        List<String> lists = new ArrayList<>();        // 开启十个线程增加数据        for (int i = 1; i <= 40; i++) {            new Thread(()->{                lists.add(UUID.randomUUID().toString().substring(0,5));                System.out.println(Thread.currentThread().getName()+"=="+lists);            },String.valueOf(i)).start();        }    }}

其运行结果如下所示:

Java JUC中如何操作List安全类的集合

多线程操作同一集合对象信息,往往会出现java.util.ConcurrentModificationException异常报错信息。

Java中提供的安全措施

在java语言中,提供了一种新的List集合,java.util.Vector类,具体看下列代码:

import java.util.*;public class ListTest {    public static void main(String[] args) throws InterruptedException {        // 创建list集合        //List<String> lists = Arrays.asList("1", "2", "3");        // 不安全        //List<String> lists = new ArrayList<>();List<String> lists = new Vector<>();        // 开启十个线程增加数据        for (int i = 1; i <= 40; i++) {            new Thread(()->{                lists.add(UUID.randomUUID().toString().substring(0,5));                System.out.println(Thread.currentThread().getName()+"=="+lists);            },String.valueOf(i)).start();        }    }}

运行日志如下所示:

Java JUC中如何操作List安全类的集合

不会出现java.util.ConcurrentModificationException报错信息。

为什么能保证数据的安全操作?

Java JUC中如何操作List安全类的集合

采取了 synchronized 针对方法执行调用者加,保证add操作的多线程安全性!

JUC下的安全List集合

在JUC包下,提供有以下几种创建安全集合的方式。

  • 方式一:Collections.synchronizedList(new ArrayList<>());

import java.util.*;public class ListTest {    public static void main(String[] args) throws InterruptedException {List<String> lists = Collections.synchronizedList(new ArrayList<>());        // 开启十个线程增加数据        for (int i = 1; i <= 40; i++) {            new Thread(()->{                lists.add(UUID.randomUUID().toString().substring(0,5));                System.out.println(Thread.currentThread().getName()+"=="+lists);            },String.valueOf(i)).start();        }    }}

查看底层源码实现逻辑

Java JUC中如何操作List安全类的集合

判断传入的 list 集合类型,判断类型是否为 java.util.RandoMaccess,如果是则采取java.util.Collections.SynchronizedRandomAccessList构造集合,如果不是则采取java.util.Collections.SynchronizedList构造集合。

源码中对应的add操作逻辑如下所示:

Java JUC中如何操作List安全类的集合

采取synchronized同步代码块的方式,对数据的add操作实现加锁!

  • 方式二:new CopyOnWriteArrayList();

import java.util.*;import java.util.concurrent.CopyOnWriteArrayList;public class ListTest {    public static void main(String[] args) throws InterruptedException {        List<String> lists = new CopyOnWriteArrayList<>();        // 开启十个线程增加数据        for (int i = 1; i <= 40; i++) {            new Thread(()->{                lists.add(UUID.randomUUID().toString().substring(0,5));                System.out.println(Thread.currentThread().getName()+"=="+lists);            },String.valueOf(i)).start();        }    }}

源码中的介绍如下:

Java JUC中如何操作List安全类的集合

Java JUC中如何操作List安全类的集合

显而易见,其逻辑如下所示:

  1. 调用add方法后,拿到java.util.concurrent.locks.ReentrantLock对象信息。

  2. 调用 lock.lock() 拿到锁!

  3. 将原数组对象copy操作,并创建原数组大小+1的新数组。

  4. 将新数据放入新数组中。

  5. 任何操作finally,都进行锁的释放!

性能方面

JUC包下的Lock操作,都比synchronized性能更好!

看完了这篇文章,相信你对“Java JUC中如何操作List安全类的集合”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Java JUC中如何操作List安全类的集合

本文链接: https://www.lsjlt.com/news/296845.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java JUC中如何操作List安全类的集合
    小编给大家分享一下Java JUC中如何操作List安全类的集合,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!不安全的集合在单线程应用中,通常采取new ArrayList(),指定一个List集合,用于存放可重复的数据。...
    99+
    2023-06-20
  • Java JUC中操作List安全类的集合案例
    目录不安全的集合Java中提供的安全措施JUC下的安全List集合性能方面不安全的集合 在单线程应用中,通常采取new ArrayList(),指定一个List集合,用于存放可重复的...
    99+
    2024-04-02
  • java 用redisTemplate 的 Operations存取list集合操作
    java redisTemplate 的 Operations存取list集合 一 、存取为list类型 @RestController @RequestMapping("/te...
    99+
    2024-04-02
  • java中怎么解决list集合做删除操作时的坑
    本篇内容主要讲解“java中怎么解决list集合做删除操作时的坑”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中怎么解决list集合做删除操作时的坑”吧!关于list集合做删除操作时的坑...
    99+
    2023-06-25
  • java 中如何实现 List 集合去重
    目录1.自定义去重2.利用 Set 集合去重3.使用 Stream 去重总结前言: List 去重指的是将 List 中的重复元素删除掉的过程。此题目考察的是对 List 迭代器、S...
    99+
    2024-04-02
  • 在Java中哪些集合类是线程安全的
    Java中线程安全的集合类:vector:比arraylist多了个同步化机制,不过效率较低。statck:堆栈类,先进后出。hashtable:就比hashmap多了个线程安全。enumeration:枚举,相当于迭代器。Concurre...
    99+
    2024-04-02
  • java集合类遍历的同时如何进行删除操作
    目录java集合类遍历的同时进行删除操作1. 背景2. 代码示例3. 分析java集合中的一个移除数据陷阱遍历集合自身并同时删除被遍历数据异常本质原因解决java集合类遍历的同时进行...
    99+
    2024-04-02
  • java中是如何实现集合的线程安全的
    今天就跟大家聊聊有关java中是如何实现集合的线程安全的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。线程安全首先要明白线程的工作原理,jvm有一个main memory,而每个线程...
    99+
    2023-05-31
    java 线程安全 ava
  • 如何在java集合中使用list方法
    本篇文章给大家分享的是有关如何在java集合中使用list方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。List接口是Collection接口的子接口,List有一个重要的...
    99+
    2023-05-30
    java list
  • java关于list集合做删除操作时的坑及解决
    目录关于list集合做删除操作时的坑解决办法对List集合的常用操作1.list中添加,获取,删除元素2.list中是否包含某个元素3.list中根据索引将元素数值改变(替换)4.l...
    99+
    2024-04-02
  • stream流的使用-获取list集合中对象的单个字段list集合,进行累加操作
    Stream流的使用 场景及代码案例源于实际项目 1. 需求描述 现存一list集合,其中保存了投资人的信息。 Person (name, age, money rateOfReturn) ...
    99+
    2023-09-08
    java lambda Stream流 stream java8
  • Java中数组的常见操作合集
    目录数组的常见操作数组越界异常数组空指针异常数组遍历数组获取最大值元素数组反转数组作为方法参数和返回值数组作为方法参数数组作为方法返回值数组的常见操作 数组越界异常 public s...
    99+
    2024-04-02
  • 详解Matlab中自带的Java操作合集
    目录1 获取鼠标在全屏位置2 获取当前剪切板内容3 内容复制到剪切板4 获取鼠标处像素颜色5 获取屏幕截图6 创建java窗口(并使其永远在最上方)7 透明窗口1 获取鼠标在全屏位置...
    99+
    2024-04-02
  • 如何解读Java三大集合中map list set的用法
    如何解读Java三大集合中map list set的用法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Map接口和Collection接口是所有集合框架的父接口...
    99+
    2023-06-25
  • List集合多线程并发条件下不安全如何解决
    目录前言一、List集合使用模拟并发测试1.1 单线程环境下1.2 多线程环境下二、解决方案2.1 使用Vector类2.1 使用Collections.synchronizedLi...
    99+
    2024-04-02
  • MongoDB中如何实现创建、删除集合操作
    这篇文章给大家分享的是有关MongoDB中如何实现创建、删除集合操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。创建集合语法格式db.createCollection(name...
    99+
    2024-04-02
  • json如何解析混合数组对象到实体类的list集合里去
    一、前言 这次项目中遇到了一个这样的需求,把下面数据解析到我下面的对象里去。 json 文件 [ { "categories": [ ...
    99+
    2024-04-02
  • Java中的集合框架概述:类和接口详解与数据操作指南
    Java中的集合框架是程序员在日常编程中不可或缺的工具之一。它提供了一套灵活、高效的数据结构和算法,用于存储、检索和操作数据。本文将介绍Java集合框架中的主要类和接口,并提供如何使用集合进行数据操作的指南。Java集合框架概览常见接口:C...
    99+
    2024-01-26
    Java集合概述 Java
  • java中如何将一个集合list转成以逗号隔开的字符串
    事例代码 代码: package com.air.app;import java.util.ArrayList;import java.util.List;public class ListToStringTest { public ...
    99+
    2023-08-17
    java list windows
  • 如何在Go语言中替代传统集合操作的需求?
    如何在Go语言中替代传统集合操作的需求? 在Go语言中,常常需要对集合进行各种操作,比如筛选、映射、聚合等。传统的做法是使用循环来实现这些操作,但是这样的代码通常比较冗长并且容易出错。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作