【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值,进行清除掉。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python网络爬虫之Urllib

概述 urllib的request模块提供了最基本的构造HTTP请求的方法&#xff0c;使用它可以方便地实现请求的发送并得到响应&#xff0c;同时它还带有处理授权验证&#xff08;authentication&#xff09;、重定向&#xff08;redirection&#xff09;、浏览器Cookies以及其他内容。 …

java算法day11

二叉树的递归遍历二叉树的非递归遍历写法层序遍历 递归怎么写&#xff1f; 按照三要素可以保证写出正确的递归算法&#xff1a; 1.确定递归函数的参数和返回值&#xff1a; 确定哪些参数是递归的过程中需要处理的&#xff0c;那么就在递归函数里加上这个参数&#xff0c; 并且…

LabVIEW机器视觉技术在产品质量检测中有哪些应用实例

LabVIEW的机器视觉技术在产品质量检测中有广泛的应用&#xff0c;通过图像采集、处理和分析&#xff0c;实现对产品缺陷的自动检测、尺寸测量和定位校准&#xff0c;提高生产效率和产品质量。 1. 电子元器件质量检测 在电子制造业中&#xff0c;电子元器件的质量检测是确保产品…

AI绘画杀死了设计师!?恰恰相反……

与大多数人想象的不同&#xff0c;ChatGPT等各种AI工具爆火之后&#xff0c;受到冲击最大的居然是设计师、作家、翻译等具有创造性的工作&#xff0c;以体力劳动为主的蓝领反而最不易被替代。 以城市数据团做过的一项研究为例&#xff0c;他们对中国1639种职业进行了GPT替代风险…

蚁剑编码器编写——php木马免杀

蚁剑编码器编写——php木马免杀 我的想法是 木马要先免杀&#xff0c;能够落地&#xff0c;再去考虑流量层面的问题 举几个例子演示一下 命令执行与代码执行是有比较大的区别&#xff0c;蚁剑执行的是php代码&#xff0c;而system&#xff0c;proc_open,passthru,exec,shell_…

【C++深度学习】多态(概念虚函数抽象类)

✨ 疏影横斜水清浅&#xff0c;暗香浮动月黄昏 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…

比curl更直观的网站性能测试工具httpstat——筑梦之路

GitHub - davecheney/httpstat: Its like curl -v, with colours. wget https://raw.githubusercontent.com/reorx/httpstat/master/httpstat.pymv httpstat.py /usr/bin/httpstat #移动到环境变量路径chmod x /usr/bin/httpstat #添加可执行权限 exec bash #重置当前bash进…

Python爬虫教程第3篇-解决使用reqeusts遇到的ProxyError异常

起因 问题出现在windows电脑上&#xff0c;我用mac执行程序的时候并不会报错&#xff0c;但是如果在windows上的时候&#xff0c;大部分windows电脑会报错&#xff0c;而有些版本低的windows电脑又不会报错。 异常栈信息 HTTPSConnectionPool, Cannot connect to proxy, no …

《昇思25天学习打卡营第14天|计算机视觉-ShuffleNet图像分类》

FCN图像语义分割&ResNet50迁移学习&ResNet50图像分类 当前案例不支持在GPU设备上静态图模式运行&#xff0c;其他模式运行皆支持。 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端…

海外路人采访:提高了广告推广的曝光率-华媒舍

在当今社交媒体和网络广告的世界中&#xff0c;我们经常会听到关于火爆推广的故事&#xff0c;但人们对其背后的机制却知之甚少。本文将通过采访七位路人的经历&#xff0c;揭示这些火爆推广背后的秘密&#xff0c;帮助读者更好地理解和应对这一现象。 路人一&#xff1a;微博热…

昨日头条管理系统设计

设计一个“昨日头条”类似的内容管理系统时&#xff0c;我们可以借鉴内容管理系统设计原则&#xff0c;并针对“昨日头条”这类新闻资讯类应用的特点进行定制化设计。以下是一些关键点&#xff1a; 1. 内容采集与整合 智能抓取&#xff1a;设计爬虫系统自动抓取国内外各大新闻…

鸿蒙语言基础类库:【@ohos.util.Vector (线性容器Vector)】

线性容器Vector 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Vect…

【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)

文章目录 前言注意事项1 Tikz 的调用方法&#xff1a;newcommand2 标号圆圈数字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法&#xff1a;插入点相对位移标号node3.1 第一张图&#xff1a;插入点相对位移3.2 第二张图&#xff1…

java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Int

java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Int fun main(args: Array<String>) {var any1: Any?any1 nullval n1 any1 as? Int ?: -2024println(n1)kotlin.runCatching {var any2: Any?any2 nullval n2 any2 as Intprintln(…

base SAS programming学习笔记10(combine data)

1.一对一合并 基本格式如下&#xff1a; data output-data-set; set data-set1; set data-set2;(data-set1和data-set2可以是相同的数据集&#xff0c;可以添加多个set 语句来实现上述的一对一合并) run; 输出数据集结果如下&#xff1a; a.会包含所有输入数据的变量名&#x…

多头注意力的公式理解

多头注意力 (Multihead Attention) 多头注意力是一种通过并行使用多个注意力机制来增强模型能力的方法。每个注意力机制被称为一个“头”&#xff08;head&#xff09;。这种机制使得模型可以在不同的子空间中并行计算注意力&#xff0c;从而捕捉输入数据中不同范围的依赖关系…

如何写好品牌宣传稿提升品牌曝光?看这篇文章就够了

在这个信息爆炸的时代&#xff0c;一句精炼而富有力量的宣传语&#xff0c;足以让品牌在万千竞争者中脱颖而出。撰写一篇成功的品牌宣传稿&#xff0c;不仅是对文字艺术的驾驭&#xff0c;也是对品牌灵魂的深刻洞察与精准传达&#xff0c;更是连接品牌与消费者情感与认知的桥梁…

华为防火墙上的配置(1)

实验拓扑图 实验要求&#xff1a; 1、DMZ区内的服务器&#xff0c;生产区仅能在办公时间内&#xff08;9&#xff1a;00-18:00)可以访问&#xff0c;办公区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3、办公区设备10.0.2.10不…

MT5016A-ASEMI逆变焊机专用MT5016A

编辑&#xff1a;ll MT5016A-ASEMI逆变焊机专用MT5016A 型号&#xff1a;MT5016A 品牌&#xff1a;ASEMI 封装&#xff1a;KBPC-4 批号&#xff1a;2024 现货&#xff1a;50000 正向电流&#xff08;Id&#xff09;&#xff1a;50A 反向耐压&#xff08;VRRM&#xff0…

位运算在数据库中的运用实践-以MySQL和PG为例

目录 前言 一、两种不同的数据库设计 1、状态字段存储JSON 2、使用位运算 二、数据库中的位运算实践 1、MySQL中的位运算实践 2、PostgreSQL中位运算实践 三、总结 前言 最近在解决某用户的一个业务需求时&#xff0c;遇到一个很有意思的场景。首先先跟大家分享一下需求…