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

news2024/9/9 7:30:01

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.coloradmin.cn/o/1918843.html

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

相关文章

【cocos creator】2.x,伪3d拖拽,45度视角,60度视角,房屋装扮

伪3d拖拽,45度视角,60度视角 工程下载:(待审核) https://download.csdn.net/download/K86338236/89530812 dragItem2.t s import mapCreat2 from "./mapCreat2";const {ccclass, property } = cc._decorator; /*** 拖拽类,挂在要拖拽的节点上*/ @ccclass export…

04:定时器

定时器 1、定时器怎么定时2、怎样实现计数&#xff1f;2.1、控制寄存器TCON2.2、工作模式寄存器TCOM2.3、定时器T0 3、案例&#xff1a;通过定时器T0控制LED间隔1s亮灭 当定时器用的时候&#xff0c;靠内部震荡电路数数。当配置为定时器使用时&#xff0c;每经过1个机器周期&am…

【JavaEE】网络编程——UDP

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; 文章目录 1.数据报套接字(UDP)1.1特点1.2编码1.2.1DatagramSocket1.2.2DatagramPacket…

数据结构复习计划之复杂度分析(时间、空间)

第二节&#xff1a;算法 时间复杂度和空间复杂度 算法(Algorithm)&#xff1a;是对特定问题求解方法(步骤)的一种描述&#xff0c;是指令的有限序列&#xff0c;其中每一条指令表示一个或多个操作。 算法可以有三种表示形式&#xff1a; 伪代码 自然语言 流程图 算法的五…

时间地点双限定|省公派教师喜提香港城市大学访问学者邀请函

X老师的研究方向为图像处理和机器学习&#xff0c;其根据专业特点及外语水平&#xff0c;将访学目标锁定在香港&#xff0c;并要求20天内获得邀请函以申报省公派。我们仅用了10天时间&#xff0c;就获得了香港城市大学的邀请函&#xff0c;且研究方向高度契合&#xff0c;完成了…

Hive的分区表分桶表

1.分区表&#xff1a; 是Hive中的一种表类型&#xff0c;通过将表中的数据划分为多个子集&#xff08;分区&#xff09;&#xff0c;每个分区对应表中的某个特定的列值&#xff0c;可以提高查询性能和管理数据的效率。分区表的每个分区存储在单独的目录中&#xff0c;分区的定义…

【正点原子i.MX93开发板试用连载体验】为什么模型不能运行在NPU上

本文最早发表于电子发烧友论坛&#xff1a;【新提醒】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 昨天提到要使模型运行的NPU上&#xff0c;必须先将其量化。如果对没有量化…

构建未来对话:从零开始实现基于Vue 3的AI聊天页面

大家好&#xff0c;今天我们将一起探索如何从零开始&#xff0c;使用Vue 3构建一个AI对话页面。这个过程不仅会让我们了解Vue 3的新特性&#xff0c;还会让我们对构建交互式Web应用有一个全新的认识。如果你是编程新手&#xff0c;别担心&#xff0c;我会用通俗易懂的语言&…

汽车免拆诊断案例 | 2016款保时捷Macan车发动机故障灯异常点亮

故障现象  一辆2016款保时捷Macan车&#xff0c;搭载CYP发动机&#xff0c;累计行驶里程约为11.2万km。车主进厂反映&#xff0c;发动机故障灯异常点亮。 故障诊断  接车后试车&#xff0c;发动机怠速无明显异常&#xff0c;组合仪表上的发动机故障灯异常点亮。用故障检测仪…

数字信号处理及MATLAB仿真(4)——量化的其他概念

上回书说到AD转换的两个步骤——量化与采样两个步骤。现在更加深入的去了解以下对应的概念。学无止境&#xff0c;要不断地努力才有好的收获。万丈高楼平地起&#xff0c;唯有打好基础&#xff0c;才能踏实前行。 不说了&#xff0c;今天咱们继续说说这两个步骤&#xff0c;首先…

stm32学习笔记---MPU6050(理论部分)

目录 MPU6050简介 MPU6050参数 硬件电路 MPU6050框图 PS产品说明书和RM寄存器映像手册 PS产品说明书 RM寄存器映像 采样频率分频器 配置寄存器 陀螺仪配置寄存器 加速度计配置寄存器 数据寄存器 电源管理寄存器1 电源管理寄存器2 器件ID号 声明&#xff1a;本专…

css实现左右两端,并且对齐

<div class"card-header"><span>就诊人管理</span><el-button class"button" type"primary" >添加就诊人</el-button></div>.card-header {display: flex; //实现两端justify-content: space-between; //侧…

计算机基础 进制转化

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

AMEYA360:类比半导体三款车规级新品介绍

类比半导体三款全新车规级智能驱动芯片——HD70504与HD70804四通道高边驱动、HD7004低导通电阻高边驱动以及DR8112直驱马达驱动芯片介绍&#xff0c;进一步扩展了其汽车智能驱动产品的深度与广度。 新品首发&#xff0c;诠释“芯”动未来 HD70504 & HD70804四通道高边驱动芯…

Windows电脑安装Python结合内网穿透轻松搭建可公网访问私有网盘

文章目录 前言1.本地文件服务器搭建1.1.Python的安装和设置1.2.cpolar的安装和注册 2.本地文件服务器的发布2.1.Cpolar云端设置2.2.Cpolar本地设置 3.公网访问测试4.结语 前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言&#xff0c;在自己的电脑上搭建…

【Spring Boot】Spring原理:Bean的作用域和生命周期

目录 Spring原理一. 知识回顾1.1 回顾Spring IOC1.2 回顾Spring DI1.3 回顾如何获取对象 二. Bean的作用域三. Bean的生命周期 Spring原理 一. 知识回顾 在之前IOC/DI的学习中我们也用到了Bean对象&#xff0c;现在先来回顾一下IOC/DI的知识吧&#xff01; 首先Spring IOC&am…

【GC 垃圾回收算法和回收器】

作者&#xff1a;ofLJli 链接&#xff1a;https://juejin.cn/post/7003213289425633287?searchId20240709085629749958B21D886D4E67D4 来源&#xff1a;稀土掘金 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 概述 在JVM中主要的结构为&…

电脑桌面文件不见了怎么恢复?需要了解的5个知识和恢复方法!

电脑桌面文件不见了怎么恢复&#xff1f;电脑文件千万条&#xff0c;数据恢复第一条。 当我们发现电脑文件丢失时&#xff0c;切勿着急&#xff0c;只要没有做二次覆盖&#xff0c;丢失的文件还是有机会找回来的。本文整理了电脑误删文件的恢复方法&#xff0c;并提供了一些列…

ZGC在三色指针中的应用

ZGC基于颜色指针的并发处理算法 ZGC初始化之后&#xff0c;整个内存空间的地址视图被设置为Remapped&#xff0c;当进入标记阶段时的视图转变为Marked0&#xff08;也称为M0&#xff09;或者Marked1&#xff08;也称为M1&#xff09;&#xff0c;从标记阶段结束进入转移阶段时…

社区团购小程序源码系统 带完整的安装代码以及搭建部署教程

系统概述 在这个数字化时代&#xff0c;线上活动成为了连接用户与组织者的桥梁。为了满足不同场景的需要&#xff0c;开发一个灵活、可定制的在线活动报名表单小程序显得尤为重要。本文将深入介绍一个自定义在线活动报名表单小程序的源码系统&#xff0c;并提供详细的搭建部署…