每日一学(1)

目录

1、ConCurrentHashMap为什么不允许key为null?       

2、ThreadLocal会出现内存泄露吗?

3、AQS理解

4、lock 和 synchronized的区别


1、ConCurrentHashMap为什么不允许key为null?       

       底层  putVal方法 中 如果key || value为空 抛出空指针异常

       其实是为了避免在多线程并发场景下的歧义问题

       在获取key 返回结果为null 无法判断是 put(k,v)的时候 value本身是null值,还是key本身不存在。还是key存在 value为空 。这种不确定性造成线程安全问题 而ConCurrentHashMap本身是线程安全的集合,固key不能为null

2、ThreadLocal会出现内存泄露吗?

        ThreadLocal是用来解决线程安全性的一个工具,让每个线程都开辟了一块内存空间,用来存储共享变量的一个副本,然后每个线程只需要去访问和操作自己的共享变量的副本,去避免多线程竞争同一个共享资源。

        每个线程都有一个成员变量, ThreadLocalMap,当线程访问ThreadLocalMap修饰的成员变量时候, 保存数据副本 key为 ThreadLocal, 是弱引用 value 保存的是共享数据的副本 每个线程都有一个副本, 不存在对于共享数据的并发操作 解决了线程安全问题。

        弱引用 : 成员变量ThreadLocal 允许在引用关系存在的情况下被GC回收 一旦回收 key 的引用就会变为null, 就会导致内存永远无法被访问,造成内存泄漏

        ThreadLocal设计是一定存在内存泄漏的 。

        为了避免问题 在进行数据读写的时候 ThreadLocal默认会做一些清理动作,找到并清理entry里面的key为null的数据

        具体方法:

        1、每次用完ThreadLocal后,主动调用 remove() 方法移除数据 (最好方法)

        2、 ThreadLocal声明为全局变量,使得无法被GC回收(如果后续线程不再访问这个key,也会造成内存泄漏)

        最终回答:

        不恰当的使用threadlocal会造成内存泄漏,主要原因threadlocalmap里面的key是一个弱引用,弱引用特性是 不管是否存在直接引用的关系,当threalocal 没有其他的强引用关系的时候,对象就会被GC回收掉,从而导致key可能变为null,造成内存无法被访问

 

3、AQS理解

        AQS是多线程同步器,提供了两种锁的机制

        3.1、排它锁

        存在多个线程去竞争同一共享资源的时候,同一时刻只允许一个线程去访问这样一个共享资源,也就是多个线程中只能有一个线程去获得一个锁资源,

        比如 lock中的 ReentrantLock 重入锁,就是用到了AQS 中排它锁的功能

        3.2、共享锁

        也称为读锁,同一时刻允许多个线程同时获得锁的资源

         3.3、 AQS 作为互斥锁 需要解决三个核心问题
                3.3.1、互斥变量的设计如何保证多线程同时更新互斥变量的时候线程的安全性

         采用int 类型的互斥变量 state,用来记录锁竞争的状态 (0--没有 >=1 有线程持有。 线程获取锁资源 先会判断 state 是否为0 如果是 更新状态为1 表示占有到锁。 如果多个线程同时做一个操作,导致线程安全性问题,AQS 采用CAS机制保证state 互斥变量更新的一个原子性

                3.3.2、未竞争到锁资源的线程等待 以及竟遭到锁的资源释放锁之后的唤醒

        未获取到的线程 通过unsafe类中的park方法,去进行阻塞,把阻塞的线程按照先进先出的原则去加入到一个双向链表的一个结构中。当获取到锁资源的线程释放锁之后,会从双向链表的头部去唤醒下一个等待的线程,再去竞争锁

                3.3.3、锁竞争的公平性和非公共性

           公平锁先会判断双向链表是否有阻塞的线程,如果有就会排队等候

           非公平锁,不管是否有等待的线程,都会直接尝试更改state 去竞争锁

4、lock 和 synchronized的区别
  特性:

          synchronized:

          是java中的同步关键字。 两种方法控制锁定力度:1、把synchronized关键字修饰在方           法层面。2 、修饰在代码块上。  通过synchronized加锁对象的生命周期来控制锁定作用范           围。比如:锁对象是静态对象          或者是类对象,锁就属于全局锁。锁对象是普通实例对             象,锁定范围取决于实例生命周期。

          Lock

          是J.U.C包提供的接口,实现类: ReentrantLock重入锁的实现。  Lock中锁的力度是             通过 unlock() 方法和 lock() 方法来决定的,锁定作用域取决于Lock实例的生命周期

相同点: 

         功能:都是java中用来解决线程安全的问题一个工具       

不同点:

        1、Locksynchronized 灵活性更高

        Lock可以自主决定什么时候加锁,什么时候释放锁,只需要调用lock /unlock方法。Lock还提供了非阻塞的竞争锁方法,trylock方法, 通过返回true /false 来告诉当前线程是否已经存在有其他线程正在使用锁

        synchronized 是关键字。无法实现非阻塞竞争锁的方法, synchronized 锁的释放被动的,只有当synchronized 同步代码快 执行结束以后或者代码出现异常 ,才会被释放。

        2、Lock 提供了公平锁、非公平锁机制。 synchronized 只提供了非公平锁的实现

        3、性能差别

        synchronized 引入偏向锁、轻量级锁、重量级锁、以及锁升级的机制去实现锁的优化

        Lock 用到了自旋锁的方法实现性能优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/361890.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【移动应用开发期末复习】第五/六章

系列文章 第一章——Android平台概述 第一章例题 第二章——Android开发环境 第二章例题 第三章 第三章例题 第四章 系列文章界面布局设计线性布局表格布局帧布局相对布局约束布局控制视图界面的其他方法代码控制视图界面数据存储与共享首选项信息数据文件SQLite数据库Content…

Oracle数据库使用指南基本概念

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

【前端】HTML+CSS复习记录【2】

文章目录 前言一、img(图片标签)二、a(链接标签)三、ul(无序列表)四、ol(有序列表)系列文章目录 前言 长时间未使用HTML编程,前端知识感觉忘得差不多了。通过梳理知识点…

【可控图像生成系列论文(二)】MimicBrush 港大、阿里、蚂蚁集团合作论文解读2

【可控图像生成系列论文(一)】简要介绍了论文的整体流程和方法,本文则将就整体方法、模型结构、训练数据和纹理迁移进行详细介绍。 1.整体方法 MimicBrush 的整体框架如下图所示。为了实现模仿编辑,作者设计了一种具有双扩散模型…

【vue3】【vant】 移动本草纲目案例发布收藏项目源码

【vue3】【vant】 移动本草纲目案例发布收藏项目源码 获取源码方式项目说明:其中功能包括 项目包含:项目运行环境文件截图 获取源码方式 加Q群:632562109项目说明: 本系统是使用vue3语法结合vant开发的移动端的本草纲目案例。 用…

制作一个智能体:抖音热点话题文案制作助手

文章目录 第一步,添加助手第二步,选择语聚GPT第三步,填写相关信息第四步,工具中选择抖音(普通号)第五步,选择“查询热门视频数据”第六步,测试总结 这篇文章,我们手把手的演示开发一个智能体&am…

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes References O…

MyPostMan:按照项目管理接口,基于迭代生成接口文档、执行接口自动化联合测试

MyPostMan 是一款类似 PostMan 的接口请求软件,不同于 PostMan 的是,它按照 项目(微服务)、目录来管理我们的接口,基于迭代来管理我们的接口文档,可导出或者在局域网内共享,按照迭代编写自动化测…

微信小程序-自定义组件checkbox

一.自定义Coponent组件 公共组件:将页面内公共的模块抽取为自定义组件,在不同页面复用。 页面组件:将复杂页面进行拆分,降低耦合度,有利于代码维护。 可以新建文件夹component放组件: 组件名为custom-che…

【Unity】Timeline的倒播和修改速度(无需协程)

unity timeline倒播 一、核心: 通过playableDirector.playableGraph.GetRootPlayable(i).SetSpeed(speed)接口,设置PlayableDirector的速度。 二、playableGraph报空 若playableDirector不勾选Play On Awake,则默认没有PlayableGraph,需执行playableDirector…RebuildGr…

mysql备份和恢复

目录 一、数据库备份的分类 二、常见的备份方法 三、MySQL完全备份 1)数据库完全备份与恢复 2)mysqldump备份与恢复 1、完全备份一个或多个完整的库(包括其中所有的表) 2、完全备份 MySQL 服务器中所有的库 3、完全备份某…

Qt Quick Effect Maker 工具使用介绍

一、介绍 随着 Qt 版本的不断升级,越来越多的功能被加入 Qt,一些新的工具也随之应运而生,Qt Quick Effect Maker 工具是 Qt 6.5 之后才新添加的工具,之前的名字应该是叫做 Qt shader tool 这个模块。 以下是官方的释义:Qt Quick Effect Maker是一个用于为Qt Quick创建自定…

DC/AC电源模块一种效率与可靠性兼备的能源转换解决方案

DC/AC电源模块都是一种效率与可靠性兼备的能源转换解决方案 DC/AC电源模块是一种能够将直流电源(DC)转换为交流电源(AC)的设备。它在现代电子设备中扮演着非常重要的角色,因为许多设备需要交流电源才能正常运行。无论…

金融科技行业创新人才培养与引进的重要性及挑战

金融科技行业作为金融与科技的深度融合产物,正以前所未有的速度改变着传统金融业的格局。在这一变革中创新人才的培养与引进成为了行业发展的核心驱动力。然而,尽管其重要性不言而喻,但在实际操作中却面临着诸多挑战。 一、创新人才培养与引进…

echarts 5.5.0版本下的层叠柱形图,每个值都从0开始,会有覆盖情况

需求: 1、每个公司,需要两个柱子去展示(stack: 1是第一个柱子,stack:2,是第二个柱子); 2、必须每个数据都是从0开始,不在上一个值上累加; 3、鼠标滑上去的时候,最大值…

ffmpeg音视频开发从入门到精通——ffmpeg日志及目录操作

文章目录 FFMPEG1. 操作日志2. 文件移动和删除3. 操作目录重要函数 FFMPEG 1. 操作日志 日志级别 AV LOG ERROR AV LOG WARNING AV LOG INFO AV LOG DEBUG cmake_minimum_required(VERSION 3.27) project(FFmpeg_exercise) set(CMAKE_CXX_STANDARD 14)# 定义FFmpeg的安装路…

基于Java技术的在线学习平台系统

开头语:你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:Java技术,基于SpringBoot框架 工具:Eclipse、Navicat、M…

【ocean】ocnPrin结合getData导出数据

核心就是这一句ocnPrint(?output fout leafValue( getData(“/output” ?result “dc”))) r_list list(4000, 4100, 4200) multi_list list(20,21,22) fout outfile("/home/yourpath/results.txt" "w") foreach(r_value r_listforeach(multi_value …

Redis数据库(六):主从复制和缓存穿透及雪崩

目录 一、Redis主从复制 1.1 概念 1.2 主从复制的作用 1.3 实现一主二从 1.4 哨兵模式 1.4.1 哨兵的作用 1.4.2 哨兵模式的优缺点 二、Redis缓存穿透和雪崩 2.1 缓存穿透——查不到 2.1.1 缓存穿透解决办法 2.2 缓存击穿 - 量太大,缓存过期 2.2.1 缓存…

高频面试题基本总结回顾2(含笔试高频算法整理)

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…