每日一学(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.mzph.cn/news/861184.shtml

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

相关文章

深度解析RocketMq源码-高可用存储组件(四)Dledger框架日志同步流程

1.绪论 在深度解析RocketMq源码-高可用存储组件(一) raft协议详解-CSDN博客 中讲过,raft协议中,日志同步主要有两个地方,一个是leader会跟follower同步数据,另一个是在新leader诞生的时候,会与…

6.浏览器缓存

上一篇👉: 浏览器存储 浏览器缓存 文章目录 浏览器缓存1. 浏览器缓存机制的理解初次加载资源强制缓存阶段协商缓存阶段服务器响应版本控制策略 2 浏览器资源缓存的位置Service Worker缓存Memory Cache(内存缓存)Disk Cache(磁盘缓…

更换Homebrew镜像源

Homebrew 是 macOS 上非常受欢迎的包管理工具,但有时由于网络问题,从默认源下载软件包可能会非常缓慢。为了解决这个问题,我们可以将 Homebrew 的源更换为国内的镜像,以提高下载速度。以下是更换 Homebrew 镜像源的通用步骤及错误…

【Pytorch实战教程】基于投影梯度下降(PGD)方法的对抗样本生成

文章目录 1. 总体介绍2. 完整代码3. 投影梯度下降(PGD)方法的详细介绍3.1. 背景3.2. PGD方法简介3.3. PGD攻击算法步骤3.4. PGD攻击的实现3.5. 代码解释3.6. 核心代码解释:4 补充说明x = inputs.detach()的详细解释1. 总体介绍 使用PyTorch实现基于投影梯度下降(Projected…

npm ERR! ..... reason: certificate has expired(淘宝镜像过期)

在执行npm install命令时,报错如下 npm ERR! request to https://registry.npm.taobao.org/babel/plugin-syntax-dynamic-import/download/babel/plugin-syntax-dynamic-import-7.8.3.tgz failed, reason: certificate has expired原因:淘宝证书过期 解…

vue2面试题——指令

1. 如何自定义指令 全局指令:在main.js里面写 /* 全局自定义指令 */ // main.js文件 import Vue from vue import App from ./App.vue import router from ./router import store from ./storeVue.config.productionTip falseVue.directive(demo,{inserted: functi…

【新闻】金融专业“免进”!私募巨头招聘涌现“新剧情”

A股市场在2024年逐渐出现新的运行特征,这不禁让部分主动投资的私募巨头公司重新登上招聘舞台。 但这一次,他们的招聘方向出现了新的变动。 有些机构有意识的为公司投研团队招聘“衔接”岗,有些则把重点放在了投研动作的交易层。 但这都不如…

小公司全栈是归宿吗?

在软件开发领域,特别是在小公司或初创公司中,全栈开发者的角色确实相对普遍和重要。然而,说“全栈是归宿”可能过于绝对,因为每个开发者的职业路径和兴趣点都是不同的。 以下是关于全栈开发在小公司的一些考虑: 需求…

JS实现:计算不同时区的当地时间

国内的时间都以北京时间为准(即东八区的时间),如何计算同一时间下其它时区的当地时间呢? 通常的做法,是计算出时区差,然后进行加减。 还有另一种方法,就是先把本地时间转为 0时区的utc时间&…

如何使用代理 IP 防止多个 Facebook 帐户关联 - 最佳实践

在社交媒体被广泛应用的今天,Facebook作为全球最大的社交网络平台之一,面临着很多挑战,其中之一就是用户行为的管理和安全。 为了防止多个账户之间的关联和滥用,Facebook需要采取一系列措施,其中包括使用静态住宅代理…

云计算运维工程师的突发状况处理

云计算运维工程师在应对突发的故障和紧急情况时,需要采取一系列迅速而有效的措施来最小化服务中断的时间并恢复系统的稳定性。 以下是一些关键步骤和策略: 快速响应: 立即识别并确认故障的性质和范围。通知团队成员和相关的利益相关者,确保所有人了解当前情况。故障诊断:…

【论文阅读】-- MultiStream:探索分层时间序列的多分辨率流图方法

MultiStream: A Multiresolution Streamgraph Approach to Explore Hierarchical Time Series 摘要1 引言2相关工作2.1 堆叠图和流图可视化2.2 时间序列的层次结构2.3 交互技术 3 需求分析4 视觉映射和功能4.1 设计原理总结4.2 概述4.3 多分辨率视图4.4 控制器4.5 层次管理器 5…

使用 ADB 查看 Android 设备的 CPU 使用率(详解)

在 Android 开发和调试过程中,监控设备的性能数据至关重要。CPU 使用率是一个关键的性能指标,它能够帮助开发者识别应用的性能瓶颈和优化机会。本文将详细介绍如何使用 Android Debug Bridge (ADB) 查看设备的 CPU 使用率,并解释终端上各个参…

ssm日常项目中问题集合

一、 在Spring MVC和Spring Boot中,如果你的控制器方法参数被标注为一个Java对象,并且该对象的字段与表单输入字段的名称匹配,Spring会自动将表单数据绑定到该对象上。这种机制称为数据绑定(Data Binding)。 假设你有…

探索ChatGPT在程序员日常工作的多种应用

引言 在现代科技迅猛发展的今天,人工智能的应用已经深入到我们生活和工作的各个方面。作为程序员,我们时常面临大量繁杂的任务,从代码编写、错误调试到项目管理和团队协作,每一项都需要花费大量的时间和精力。近年来,…

基于信息论的高动态范围图像评价算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于信息论的高动态范围图像评价算法matlab仿真,利用一种自然图像的概率模型对图像的熵与成像动态范围之间的关系进行了数值模拟,得到了具有普遍意义上…

【数据库】Oracle安装报错(口令设置问题)

目录 一、问题场景: 二、问题描述 三、原因分析: 四、解决方案: 方法一: 方法二: 一、问题场景: Oracle安装 二、问题描述 Oracle安装意外中断导致【口令管理】用户没有取消勾选/修改密码 三、原因…

mybatis中动态sql语句like concat(“%“,#{xm},“%“)

1、动态SQL是一种可以根据不同条件生成不同SQL语句的技术,随着用户输入或外部条件变化而变化的SQL语句 2、SQL语句中的like模糊查询 xm like %小米%,但开发中经常用到 xm like concat("%",#{xm},"%"),可以防止sql注入…

程序员必备的ChatGPT技巧:从代码调试到项目管理

近年来,随着人工智能技术的迅猛发展,ChatGPT作为一种强大的对话式AI工具,已经广泛应用于各个领域。而对于程序员来说,ChatGPT不仅可以帮助他们解决编程中的各种问题,还能在项目管理中发挥重要作用。本篇博客将详细介绍…

探索小众爱好:打造个人韧性与特色之路

在这个信息爆炸的时代,我们很容易陷入“千篇一律”的漩涡中,无论是生活方式还是兴趣爱好,似乎都趋向于某种“流行”或“热门”。然而,真正的个性与魅力,往往来源于那些不为大众所知的小众爱好。今天,我想和…