【Java】零散知识--感觉每条都有知识在进入脑子唤起回忆

1,什么是双亲委派

AppClassLoader在加载类时,会向上委派,取查找缓存。

AppClassLoader ==>>ExtClassLoader ==>>BootStrapClassLoader

情况一

向上委派时查找到了,直接返回。

情况二

当委派到顶层之后,缓存中还是没有则到加载路径中查找,有则加载返回,没有就向下查找。

特点

向上委派:实际上就是查找缓存

向下查找:就是查找加载路径

好处
  • 安全性,避免用户自己编写的类动态替换JAVA的以西核心类

  • 同时也避免了类的重复加载。因为JVM中区分不同类,不仅仅是根据类名,相同的class文件被不同的ClassLoader加载了也是不同的两个类。

2,线程的生命周期,线程有哪些状态

线程的基本状态(5种)

创建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)

  1. 新建(New):新创建了一个线程对象。

  2. 就绪(Runnable):线程创建后,其它线程调用了该对象的start方法,该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的运行时间片。

  3. 运行(Running):就绪状态的线程获取了CPU的运行时间片,执行代码程序。

  4. 阻塞(Blacked):阻塞状态是线程因为某种原因就放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

  5. 死亡(Dead):线程执行玩了或者因异常退出了Run方法,该线程结束生命周期。

其中阻塞情况又大概分为以下几种:

  • 等待阻塞(WAITING):运行的线程执行wait方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中,进入这个状态后,线程无法自动唤醒,必须依靠其它线程调用notify或notifyALL才能被唤醒。是属于Object的方法。

  • 同步阻塞(BLOCKED):运行的线程在获取对象同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

  • 限期等待阻塞(TIMED_WAITING):线程调用了带有超时参数的 Thread.sleep(long millis)Object.wait(long timeout)Thread.join(long millis)LockSupport.parkNanos() 等方法后,会进入限期等待阻塞状态。                                         在指定的时间过期或者等待的条件满足后,线程会自动唤醒或者超时返回。

  • I/O 阻塞:线程因为等待输入输出完成而进入阻塞状态,例如调用了阻塞式的 I/O 操作(如读取文件、网络数据)。                                                                                                             当数据到达或者操作完成时,线程会从阻塞状态恢复,并继续执行后续操作。

3,线程状态

池的概念

锁池

所有需要竞争同步锁的线程都会放在锁池中,如果当前对象的锁已经被其中一个线程得到,则其它线程需要在这个锁池中等待,等待该对象的锁释放后再去竞争这个同步锁。当线程得到满足运行条件的同步锁后就会进入就绪队列等待CPU分配运行时间片。

等待池(监狱)

当我们调用了wait()方法后,该线程就会进入等待池中,等待池的线程不会去竞争同步锁。只有调用了notify()或notifyAll()后等待池的线程才会开始去竞争同步锁。值得注意的是notify()是从等待池中随机选出一名幸运线程放入锁池中。而notifyAll()则相当于,皇帝登基,大赦天下。把关在等待池中的线程全部释放到锁池中。

sleep

  1. sleep是Thread类的静态本地方法,wait则是Object类的本地方法。

  2. sleep方法不会释放lock,但wait会释放,而且加入等待队列中。 Sleep就是把cpu的执行资格和执行全释放出去,不在运行此线程,当定时时间结束后再取回CPU资源,参与cpu的调度,获取到cpu资源就可以继续运行了。且sleep持有锁,不会释放锁,是把锁带着进入了冻结状态。其它程序无法获取这个锁。(sleep就相当于现在的租借功能,把使用权定时让出入就是cpu的执行,但是所有权(锁)还是属于出租方,锁还是再该线程。等时间结束后,使用权又回归出租方了)

  3. sleep方法不依赖于同步器synchronizad,但是wait需要依赖synchronizad关键字。

  4. sleep不需要被唤醒(休眠之后退出阻塞状态)

  5. sleep一般用于当前线程休眠,或者轮循暂停操作,wait则多用于多线程之间的通信。

  6. sleep会让出CPU执行时间且强制上下文切换,则wait则不一定

yield

yield()执行后当前线程让出cpu执行权,进入就绪状态,但是议然保留了cpu的执行资格,所以哟可能cpu下次调度还会让这个线程执行。剪刀石头布你输了不认账,重来一把(调用yield()方法),但有可能还是我赢。

join()执行后线程进入阻塞状态,例如在线程B中调用线程A的join(),线程B进入阻塞队列,直到线程A结束或中断线程。就像一场球赛上半场(B)打得起劲,裁判突然吹了哨子(A),这时B暂停,等裁判BB完了,吹起重新开赛的哨子(A运行死亡)球赛才能再开(B恢复运行。)

4,ThreadLocal的原理和使用场景

概念解释:

每一个Thread对象都含有一个ThreadLocalMap类型的成员变量threadLocals,它存储在本线程中所有ThreadLocal对象以及其对应的值

ThreadLocalMap由一个个Entry对象构成

Entry继承自WeakReference<ThreadLocal<?>>,一个Entry由ThreadLocal对象和object构成。由此可见Entry的key是ThreadLocal对象,并且是一个弱引用。当没指向key的强引用后,该key就会被垃圾收集器回收。

当执行set方法时,ThreadLocal首先会获取当前线程对象,然后获取当前线程的ThreadMap对象。再以当前ThreadLocal对象为key,获取对应value。

由于每一条线程均含有各自私有的ThreadLocalMap容器,这些容器相互独立互不影响,因此不会存在线程安全性问题,从而也无需使用同步机制来保证多条线程范文容器的互斥性。

使用场景:

  1. 在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束。

  2. 线程间数据隔离

  3. 进行事务操作,用于存储线程事务信息,

  4. 数据库连接,Session会话管理

5,ThreadLocal内存泄漏的原因,如何避免

内存泄漏为程序在申请内存后,无法释放已经申请的内存空间,一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早会被消耗殆尽。

不再被使用的对象或者变量占用的内存不能被回收,就是内存泄漏。

强引用:使用最普遍的引用(new),一个对象具有强引用,是不会被垃圾回收器回收的。当内存空间不足,java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会回收这个对象。

如果想取消引用和某个对象之间的关联,可以显示地将引用赋值为null,这样可以使JVM在合适的时间就会回收该对象。

弱引用:JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用的关联对象。在Java中,用Java.lang.ref.WeakReference类来表示。可以在缓存中使用弱引用。

ThreadLocal的实现原理,每一个Thread维护一个ThreadLocalMap,key为使用弱引用的ThreadLocal实例。

ThreadLocalMap使用使用ThreadLocal的弱引用作为key,如果一个ThreadLocal不存在外部强引用时,key(ThreadLocal)势必会被GC回收,这样就导致了ThreadLocalMap中key为null,而value还存在着强引用,只有线程退出以后,value的强引用链条才会断掉,但如果当前线程迟迟不结束的话,这些key为null的Entry的Value就会一直存在一条强引用链(红色链条)

key使用强引用

当ThreadLocalMap 的key为强引用回收ThreadLocal时,由于ThreadLocalMap还持有ThreadLocal的强引用,如果不手动删除,ThreadLocal不会被回收,导致Entry内存泄漏。

key使用弱引用

当ThreadLocalMap的key为弱引用回收ThreadLocal时,由于ThreadLocalMap还持有ThreadLocal的弱引用,即使不手动删除,ThreadLocal也会被回收,当key为null,在下一次ThreadLocalMap调用set(),get(),remove()方法时候,会被清除value的值。

因此:**ThreadLocal内存泄漏的根本原因是:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用。

ThreadLocal正确的使用方法

  • 每次用完ThreadLocal都调用它的remove()方法清除数据。

  • 将ThreadLocal变量定义为private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进行清除掉。

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

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

相关文章

CSS特效:pointer-events: none;的一种特殊应用

一、需求描述 今天看到一个设计需求&#xff1a;需要在弹框中显示如下界面&#xff0c;其中有两个效果&#xff1a; 1.顶部点击项目&#xff0c;下面的内容能相应滚动定位&#xff0c;同时滚动的时候顶部项目也能相应激活显示 2.顶部右侧有一个模糊渐变效果&#xff0c;并且要…

从0到1搭建数据中台(1)

初识 数据仓库&#xff0c;数据湖&#xff0c;大数据平台&#xff0c;数据中台的发展历程梳理&#xff1b;数据中台的搭建方法论&#xff1b;数据中台搭建的初步落地&#xff0c;参考大神郭忆的课程&#xff0c;看完就会对全貌有个理解。 Easydata大数据生产力平台架构图。 有…

vue实例和容器的一夫一制——04

//准备容器 <div classapp> <h1>{{mag}}</h1> </div> //准备容器 <div classapp> <h1>{{mag}}</h1> </div> //准备容器 <div classapp2> <h1>{{name}}</h1> </div> <script> // 验…

久期分析与久期模型

目录 一、久期分析的理论原理 二、数据准备 三、Stata 程序代码及解释 四、代码运行结果 一、久期分析的理论原理 久期&#xff08;Duration&#xff09;是衡量债券价格对利率变动敏感性的重要指标。它不仅仅是一个简单的时间概念&#xff0c;更是反映了债券现金流回收的平均…

Elasticsearch:Node.js ECS 日志记录 - Pino

在我的上一篇文章 “Beats&#xff1a;使用 Filebeat 从 Python 应用程序中提取日志” 里&#xff0c;我详述了如何使用 Python 来生成日志&#xff0c;并使用 Filebeat 来收集日志到 Elasticsearch 中。在今天的文章中&#xff0c;我来详细描述如何使用 Node.js 来生成 ECS 相…

龙迅#LT6711GXE适用于HDMI2.1转DP1.4/TPYE-C应用方案,分辨率高达8K30HZ,4K144HZ!

1. 描述 LT6711GXE 是带有 PD 控制器的 HD-DVI2.1 到 DP1.4a 转换器。 对于 HD-DVI2.1 输入&#xff0c;LT6711GXE可以配置为 3/4 通道。自适应均衡使其适用于长电缆应用&#xff0c;最大带宽高达 40Gbps。它支持最高分辨率的8K30Hz、4K144Hz或8K60Hz压缩数据&#xff08;直通&…

小巧低调的黑盒子,打造个性化音乐体验,欧尼士ONIX Alpha小尾巴上手

欧尼士ONIX的产品很有辨识度&#xff0c;这家来自英国的品牌&#xff0c;有着鲜明的黑金设计色彩&#xff0c;以及低调奢华的质感&#xff0c;当然最重要的是&#xff0c;欧尼士的音质表现非常出色&#xff0c;因此深受音乐爱好者的喜爱。在以手机等设备为载体的流媒体音乐盛行…

旅游景区度假村展示型网站如何建设渠道品牌

景区、度假村、境外旅游几乎每天的人流量都非常高&#xff0c;还包括本地附近游等&#xff0c;对景区及度假村等固定高流量场所&#xff0c;品牌和客户赋能都是需要完善的&#xff0c;尤其是信息展示方面&#xff0c;旅游客户了解前往及查看信息等。 通过雨科平台建设景区度假…

前端预览图片的两种方式:转Base64预览或转本地blob的URL预览,并再重新转回去

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 预览图片 一般情况下&#xff0c;预览图片功能&#xff0c;是后端返回一个图片地址资源&#xff08;字符串&#xff09;给前端&#xff0c;如&#xff1a;ashuai.work/static…

springboot大学校园二手书交易APP-计算机毕业设计源码25753

摘 要 在数字化与移动互联网迅猛发展的今天&#xff0c;人们对于图书的需求与消费方式也在悄然改变。为了满足广大读者对图书的热爱与追求&#xff0c;我们倾力打造了一款基于Android平台的图书交易APP。这款APP不仅汇聚了海量的图书资源&#xff0c;提供了便捷的交易平台&…

Kafka第四篇——生产数据总体概括,源码解析分区策略,数据收集器,Sender发送线程,key值

目录 流程图以及总体概述 拦截器 分区器以及分区计算策略 为啥进行分区计算&#xff1f; producer生产者怎么知道有哪些分区&#xff1f; 分区计算 如何自定义实现分区器&#xff1f; 想说的在图里啦&#xff01;宝宝&#xff01;&#x1f4a1; ​编辑 如果key值忘记传递了呢&a…

《财经一线》实地探访|4000+伙伴力挺,格行随身WiFi全国布局加速!随身wifi官方正品推荐,口碑最好的随身wifi品牌

随着无线连接需求的井喷式增长&#xff0c;随身WiFi以其便携性、高效能迅速成为市场宠儿。在这片竞争激烈的蓝海中&#xff0c;格行随身WiFi凭借其独特的创新策略与卓越品质脱颖而出&#xff0c;成为行业内的佼佼者。近日&#xff0c;《财经一线》记者实地参观格行总部&#xf…

vue-使用Worker实现多标签页共享一个WebSocket

文章目录 前言一、SharedWorker 是什么SharedWorker 是什么SharedWorker 的使用方式SharedWorker 标识与独占 二、Demo使用三、使用SharedWorker实现WebSocket共享 前言 最近有一个需求&#xff0c;需要实现用户系统消息时时提醒功能。第一时间就是想用WebSocket进行长连接。但…

stm32——AD采集以及DMA

今天继续我们的STM32的内容学习&#xff0c;我使用的单片机是STM32F103VCT6,通过Keil Array Visualization软件来观测AD采样出来的波形。先来看看本次实验用到的硬件知识。 首先是ADC&#xff08;Analog-to-Digital Converter&#xff09;是模拟信号转数字信号的关键组件&#…

x264 编码器 AArch64 汇编函数模块关系分析

x264 编码器 AArch64 汇编介绍 x264 是一个流行的开源视频编码器,它实现了 H.264/MPEG-4 AVC 标准。x264 项目致力于提供一个高性能、高质量的编码器,支持多种平台和架构。对于 AArch64(即 64 位 ARM 架构),x264 编码器利用该架构的特性来优化编码过程。在 x264 编码器中,…

纹波电流与ESR:解析电容器重要参数与应用挑战

电解电容纹波电流与ESR&#xff08;Equivalent Series Resistance&#xff09;是电容器的重要参数&#xff0c;用来描述电容器对交流信号的响应能力和能量损耗。电解电容纹波电流是指电容器在工作时承受的交流信号电流&#xff0c;而ESR则是电容器内部等效电阻&#xff0c;影响…

下载设计免抠元素,就上这6个网站,免费下载!

寻找免费PNG免抠素材网站是创意设计者们探索的重要一环。这些网站提供了丰富的PNG格式素材&#xff0c;去除了背景&#xff0c;方便在不同项目中使用。精心挑选了6个免费PNG免抠素材网站&#xff0c;它们提供了高品质的素材资源&#xff0c;无论是个人设计还是商业项目&#xf…

CVE-2024-23692: Rejetto HTTP File Server 2.3m Unauthenticated RCE漏洞复现

目录 本文章仅供学习使用&#xff01;&#xff01;&#xff01; Rejetto HTTP介绍 漏洞简介 漏洞环境 漏洞复现 exp 复现 结果 如何修复 本文章仅供学习使用&#xff01;&#xff01;&#xff01; Rejetto HTTP介绍 Rejetto是一个流行的开源软件项目&#xff0c;主要…

python开发-创建项目

一、创建项目 1.1在终端 1. 进入某个目录&#xff08;项目放在哪&#xff09; 2. 执行命令创建项目 django-admin startproject 项目名称1.2 在pycharm中创建项目 二、创建app 创建app命令 django-admin startapp app01注册app 编写URL和视图函数对应关系 编写视图函数…

1950年-2021年中国历年民航航线里程统计报告

数据为1950年到2021年我国每年的民航航线总里程数据。 2021年&#xff0c;我国定期航班航线总里程为689.78万公里&#xff0c;相比2019年下降了258.44万公里。 数据统计单位为&#xff1a;公里. 数据说明&#xff1a; 2011年起民航航线里程改为定期航班航线里程 我国定期航班…