当前位置: 首页 > news >正文

面试官:为什么说ArrayList线程不安全?

本博客知识点收录于:⭐️《JavaSE系列教程》⭐️

1)线程安全与不安全集合

我们学习集合的时候发现集合存在由线程安全集合和线程不安全集合;线程安全效率低,安全性高;反之,线程不安全效率高,安全性低,线程不安全的集合有:Vector,Stack,Hashtable等;

  • 查看Vector和Hashtable等源代码:

在这里插入图片描述

线程安全集合中的方法大部分都加上了synchronized关键字来保证线程的同步;

  • 线程不安全集合:

在这里插入图片描述

2)线程不安全集合测试

  • 数据覆盖问题:
package com.dfbz.demo05;import java.util.ArrayList;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01_集合的线程安全问题 {public static void main(String[] args) throws InterruptedException {ArrayList<String> arr = new ArrayList<>();for (int j = 0; j < 20; ++j) {new Thread(() -> {for (int i = 0; i < 100; i++) {arr.add("1");try {// 然线程安全问题更加突出Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}}
}

运行代码,发现出现数组下标越界异常:

在这里插入图片描述

分析ArrayList源码:

  • 假设此时size为9,size+1并没有大于数组的默认长度(10),并没有造成数组的扩容,等待代码将集合的9下标赋值后,size++还没来得及运算,CPU的执行权就被其他的线程抢走了,此时size仍旧为9,但此时集合中已经存储了10个元素了;等到其他线程来执行ensureCapacityInternal(9+1)—>ensureCapacityInternal—>ensureExplicitCapacity发现10-10还是小于0,依旧不扩容,代码执行elementData[size++]=e时(还没执行),线程执行权由回到了第一条线程,size++,变为10,然后线程执行器又变回执行elementData[size++]=e这段代码时的那个线程,出现了elementData[10]=e,出现数组下标越界;

在这里插入图片描述

Tips:HashMap同样会出现这个问题,将集合换成Vector或者Stack等线程安全集合可以解决这些问题;或者使用JDK提供的其他线程同步集合也可以解决这些问题;

相关文章:

面试官:为什么说ArrayList线程不安全?

本博客知识点收录于&#xff1a;⭐️《JavaSE系列教程》⭐️ 1&#xff09;线程安全与不安全集合 我们学习集合的时候发现集合存在由线程安全集合和线程不安全集合&#xff1b;线程安全效率低&#xff0c;安全性高&#xff1b;反之&#xff0c;线程不安全效率高&#xff0c;安…...

STP详解

STP STP全称为“生成树协议”&#xff08;Spanning Tree Protocol&#xff09;&#xff0c;是一种网络协议&#xff0c;用于在交换机网络中防止网络回路产生&#xff0c;保证网络的稳定和可靠性。它通过在网络中选择一条主路径&#xff08;树形结构&#xff09;&#xff0c;并…...

linux AWK常用命令 —— 筑梦之路

搜集整理awk常用命令&#xff0c;以便使用查询 # 打印文件第一列awk {print $1} rumenz.txt# 打印文件前两列awk {print $1,$2} rumenz.txt# 打印文件最后一列awk {print $NF} rumenz.txt# 打印文件总行数awk END{print NR} rumenz.txt# 打印文件第一行awk NR1{print} rumenz.…...

SpringCloud:服务拆分及远程调用

目录 SpringCloud&#xff1a;服务拆分及远程调用 1、服务拆分 2、远程调用 SpringCloud&#xff1a;服务拆分及远程调用 SpringCloud是目前国内使用最广泛的微服务框架。 官网地址: Spring Cloud SpringCloud集成了各种微服务功能组件&#xff0c;并基于SpringBoot实现了…...

网络应用之javascript函数定义和调用

函数定义和调用学习目标能够写出函数的定义和调用方式1. 函数定义函数就是可以重复使用的代码块, 使用关键字 function 定义函数。<script type"text/javascript">// 函数定义function fnAlert(){alert(hello!);} </script>2. 函数调用函数调用就是函数名…...

使用VNC远程连接Ubuntu - 内网穿透实现公网远程办公

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…...

JavaScript Date 日期对象

文章目录JavaScript Date 日期对象Date 对象Date 对象属性Date 对象方法创建日期设置日期两个日期比较JavaScript Date 日期对象 日期对象用于处理日期和时间。 Date 对象 Date 对象用于处理日期与实际。 创建 Date 对象&#xff1a; new Date(). 以上四种方法同样可以创建…...

婴幼儿常见八大疾病及护理方法

在1岁之前&#xff0c;婴儿的体质还没有完全发育&#xff0c;很容易生病&#xff0c;大多数婴儿在1岁之后都会更好。今天&#xff0c;新的稀有婴儿育儿专家组织了一些婴儿最容易患的疾病和护理方法。1、新生儿黄疸宝宝出生后&#xff0c;你可能会注意到他的皮肤发黄。别担心&am…...

UVa 817 According to Bartjens 数字表达式 DFS ID 迭代加深搜 逆波兰表达式

题目链接&#xff1a;According to Bartjens 题目描述&#xff1a; 给定一个由数字和一个组成的字符串&#xff0c;你需要在数字之间添加,−,∗,-,*,−,∗三种符号&#xff0c;在保证表达式合法的情况下&#xff08;同时形成的新的数字不能有前导零&#xff09;&#xff0c;使表…...

c++基础/类和对象

c基础 2.1名字空间 namespace 防止命名冲突 说明&#xff1a;名字空间可以在全局作用域或其他作用域&#xff08;另一个名字空间&#xff09;内部定义&#xff0c;但不能在函数或类的内部定义。 使用&#xff1a; #include<iostream> using namespace std; //std中包…...

2023年中国人工智能产业趋势报告

易观&#xff1a;尽管2022年人工智能市场发展活跃度不及预期&#xff0c;但2022年对人工智能产业来说无疑是令人激动的一年。年中由DALL-E 2以及其后Stable Diffusion和Midjourney等文本-图像生成模型引起公众对人工智能生成内容的大量关注&#xff0c;年末ChatGPT的横空出世刷…...

STM32定时器的配置,解析预分频系数和重装载值与时钟频率的关系

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都在这儿哦&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 - 蓝…...

解决Sql WorkBench中数据库不能重命名的问题

解决Sql WorkBench中数据库不能重命名的问题mysql不支持直接重命名数据库1. 连接到数据库2. 打开菜单&#xff0c;选择迁移向导3. 点击Start Migration4. 填写源数据库的相应参数5. 填写目标数据库的响应参数6. 稍等片刻&#xff0c;点击Next7. 选择你要迁移的数据库。8. 进入一…...

REFL: 联邦学习中智能的设备选择方法

原创 齐天宇 隐私计算研习社 收录于合集#联邦学习54个现有的FL方案使用随机的参与者选择来提高选择过程的公平性&#xff0c;但是这会导致资源的低效利用和较低的训练质量。本文系统地解决了FL中资源效率低效的问题&#xff0c;展示了智能参与者选择和合并来自落后参与者的更新…...

Linux:NFS服务器

目录NFS服务器的介绍例NFS服务器的介绍 1&#xff0c;NFS&#xff08;网络文件系统&#xff09;&#xff0c;主要用于服务器分享提供文件或文件系统等服务&#xff0c;与其他服务器有所不同&#xff0c;主打的是分享&#xff0c;所以没有配置文件&#xff0c;只需要在 /etc/ex…...

电子技术——数字逻辑反相器

电子技术——数字逻辑反相器 在学习完如何通过CMOS数字电路实现组合逻辑&#xff0c;接下来我们评估这种数字CMOS电路的性能。首先&#xff0c;我们考虑最基本的部件——反相器。 电压传导特性 下图是一个反相器的原理图&#xff1a; 在之前&#xff0c;我们已经介绍了MOSFE…...

python的多线程编程之锁

1、 背景概述 在上篇文章中&#xff0c;主要讲述了python中的socket编程的一些基本方面&#xff0c;但是缺少关于锁的相关概念&#xff0c;从而在这篇文章中进行补充。 由于在python中&#xff0c;存在了GIL&#xff0c;也就是全局解释器锁&#xff0c;从而在每次进行获得cpu的…...

Android Framework-进程间通信——Binder

我们知道&#xff0c;同一个程序中的两个函数之间能直接调用的根本原因是处于相同的内存空间中。 比如有以下两个函数A和B&#xff1a; /*Simple.c*/ void A() { B(); } void B() { }因为是在一个内存空间中&#xff0c;虚拟地址的映射规则完全一致&#xff0c;所以函数A和B之…...

有趣的小知识(二)浏览器内的秘密:了解Cookie基础知识

一、简介 Cookie是一种小型的文本文件&#xff0c;由Web服务器发送给Web浏览器&#xff0c;并存储在用户的计算机硬盘上。它通常用于记录用户的偏好、登录状态、购物车信息等&#xff0c;以便在用户下次访问该网站时能够提供更好的用户体验。Cookie通常包含网站的名称、Cookie的…...

Spring框架

DI:依赖注入IOC:控制反转AOP:面向切面IOC容器&#xff1a;存放管理各种对象Spring优势&#xff1a;低耦合。&#xff08;降低组件之间的关联性&#xff0c;实现软件各层之间的解耦&#xff09;声明式事务管理&#xff08;基于AOP来管理&#xff09;和其他框架的整合&#xff08…...

xhs签名验证机制详解:如何绕过小红书反爬虫系统的终极指南

xhs签名验证机制详解&#xff1a;如何绕过小红书反爬虫系统的终极指南 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 在小红书数据爬取领域&#xff0c;xhs签名验证机制是开…...

AI时代开发者必备:生成式AI应用与核心工程能力双螺旋进阶

1. 项目概述&#xff1a;当AI成为你的新同事最近和几个带团队的朋友聊天&#xff0c;发现一个挺有意思的现象&#xff1a;团队里那些能熟练把AI工具“用起来”的开发者&#xff0c;和那些还在“观望”甚至“抵触”的开发者&#xff0c;在项目交付效率、问题解决深度上&#xff…...

PHP的SPL一共包含哪些部分?使用场景是什么?底层原理是什么?

PHP的SPL一共包含哪些部分&#xff1f;使用场景是什么&#xff1f;底层原理是什么&#xff1f; 1. 什么是 SPL&#xff1f; 简单解释 SPL 是 PHP 的标准库&#xff0c;提供了一组内置的类和接口&#xff0c;用于解决常见的编程任务&#xff0c;比如遍历数据、处理文件、操作队列…...

车规级国际物联卡是什么?车载物联网硬件选型与行业标准解析

随着跨境整车出口、改装车辆、工程机械外销、车载定位终端普及&#xff0c;车载联网通信要求持续升级。普通民用SIM卡无法适配车辆颠簸、温差跨度大、高速移动、跨境切换网络的复杂工况&#xff0c;车规级国际物联卡逐步成为车载智能化硬件的标配通信载体。很多出海设备厂商容易…...

云原生地理空间分析引擎Meridian:基于Arrow与GeoParquet的高性能架构解析

1. 项目概述&#xff1a;一个面向未来的开源地理空间数据引擎最近在折腾一个涉及大量地理信息处理的项目&#xff0c;从海量GPS轨迹点到复杂的多边形区域分析&#xff0c;传统的数据库和工具链在处理效率和灵活性上开始捉襟见肘。就在这个当口&#xff0c;我注意到了GitHub上一…...

BBDown完全指南:5分钟掌握B站视频下载终极方案

BBDown完全指南&#xff1a;5分钟掌握B站视频下载终极方案 【免费下载链接】BBDown Bilibili Downloader. 一个命令行式哔哩哔哩下载器. 项目地址: https://gitcode.com/gh_mirrors/bb/BBDown 你是否经常遇到想收藏B站优质视频却找不到合适工具的困扰&#xff1f;当网络…...

18.地下室的服务器

六月第一个周末的深夜&#xff0c;暴雨如注。陈远坐在书桌前&#xff0c;屏幕上是花花绿绿的监控图表&#xff0c;代表着他那台二手服务器资源使用率的曲线&#xff0c;正像垂死病人的心电图一样剧烈地上下跳动。CPU占用率长时间维持在90%以上&#xff0c;内存也逼近红线。这已…...

SAP CAP集成RAG架构实战:基于HANA Cloud与AI Core的企业级AI应用开发

1. 项目概述&#xff1a;当企业级SAP CAP遇上生成式AI如果你是一位SAP开发者&#xff0c;或者正在用SAP Cloud Application Programming Model (CAP) 构建企业级应用&#xff0c;最近可能被一个词刷屏了&#xff1a;RAG。没错&#xff0c;就是检索增强生成。当严谨、结构化、流…...

深度解析开源AI工具库:OpenAI API封装库的设计与实战应用

1. 项目概述&#xff1a;一个开源AI工具库的深度解构最近在GitHub上看到一个名为“anasfik/openai”的项目&#xff0c;这个标题乍一看有点意思。它不像官方SDK那样直接叫“openai”&#xff0c;而是带上了个人或组织的命名空间前缀“anasfik/”。这通常意味着这是一个第三方封…...

黑莓印相≠复古滤镜!基于CIE Lab色域分析的Midjourney色彩空间偏移校准方案(附Python验证脚本)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;黑莓印相≠复古滤镜&#xff01;基于CIE Lab色域分析的Midjourney色彩空间偏移校准方案&#xff08;附Python验证脚本&#xff09; 黑莓印相&#xff08;Blackberry Print Tone&#xff09;常被误认为是…...