自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(105)
  • 资源 (2)
  • 收藏
  • 关注

原创 操作系统(八)上下文切换的开销?如何减少上下文切换开销?

本文深入分析了上下文切换的开销,包括任务状态保存、选择下一个待执行任务及其上下文恢复的过程。直接开销涉及寄存器数据量的保存与恢复,特别是对于具有大量数据的FPU、MMX、SSE、AVX等寄存器,以及内核更新统计数据和调度算法的选择。间接开销主要与缓存失效(如L1~L3 cache miss和TLB cache miss)相关,可能导致显著的性能损耗。文章还讨论了PCID对TLB管理的影响,以及在不同场景下可能带来的开销。此外,提到了启动新线程或进程时的非紧密相关开销,以及量化上下文切换开销的复杂性,包括硬件

2024-08-07 12:51:19 1126

原创 操作系统(七)深入理解Linux内核进程上下文切换

本文深入探讨了Linux内核中的进程上下文切换机制。作者韩传华首先解释了进程上下文的概念,包括虚拟地址空间和硬件上下文,并以Linux 5.0内核源码和ARM64架构为例进行讲解。文章详细介绍了进程上下文切换的两个主要过程:进程地址空间切换和处理器状态切换。在地址空间切换部分,讨论了mm_struct结构体的作用、页全局目录的设置以及使用ASID机制减少TLB清空的必要性。处理器状态切换部分则涉及硬件上下文的保存和恢复,包括寄存器的保存和恢复流程。文章还探讨了ASID机制如何提高系统性能,以及普通用户进程、

2024-08-07 12:50:21 1068

原创 计算机网络(五)什么是跨域问题(CORS)(Access-Control-Allow-Origin)(Access-Control-Allow-Credentials)

跨域是指浏览器在请求不同源(协议、域名或端口)的资源时遇到的限制,这是浏览器的内置安全机制。跨域问题通常发生在需要访问多个后端服务的场景中。为解决这一问题,W3C制定了CORS(跨源资源共享)协议,允许服务端通过特定的响应头字段(如Access-Control-Allow-Origin)来放行特定来源的请求。CORS协议区分简单请求和非简单请求,简单请求自动携带Origin字段,非简单请求则先发送OPTIONS预检请求。服务端需正确设置Access-Control-Allow-Methods和Access

2024-08-07 12:49:40 1224

原创 JVM(十二)细谈JVM类加载的各个过程以及如何修改Java原生API

本文深入探讨了Java虚拟机(JVM)的类加载机制,包括类的加载、验证、准备、解析和初始化等过程。文章首先通过几个高级面试问题引入主题,然后详细解释了JVM类加载的五个阶段及其重要性。接着,介绍了Java的三个主要类加载器:启动类加载器、扩展类加载器和应用类加载器,并阐述了双亲委派机制的工作原理和其在保证Java类加载安全性中的作用。文章还讨论了打破双亲委派机制的几种情况,如Tomcat、JDBC的SPI机制和OSGi。最后,介绍了如何使用endorsed技术替换JDK中的类。

2024-08-07 12:48:52 1357

原创 JVM(十一)深入理解JVM类加载全过程以及各种类加载器

本文深入探讨了Java类加载器的工作原理和类加载过程,包括类的生命周期、加载时机、类加载机制,并提供了自定义类加载器的示例。文章首先解释了类加载过程的五个阶段:加载、验证、准备、解析和初始化,并讨论了类的主动使用和被动引用场景。接着,介绍了双亲委派模型,阐释了类加载器的层次结构和职责,包括启动类加载器、扩展类加载器和应用类加载器。文章还提供了实用技巧,如排查类加载问题、调整类加载路径和运行时动态加载类。

2024-08-07 12:48:01 1642

原创 JVM(十)深入理解JVM类加载模型以及双亲委派模型

本文详细介绍了Java的类加载机制,包括加载、链接和初始化三个阶段。强调了双亲委派模型的重要性,这是一种避免重复加载类并维持Java核心库安全的类加载策略。文章还探讨了Java类加载器的不同类型,包括启动类加载器、扩展类加载器和应用类加载器,并讨论了Java 9中引入的模块化系统对类加载器架构的影响。此外,提到了自定义类加载器的使用场景,如进程内隔离和动态字节码操作。最后,介绍了AppCDS技术,它通过共享归档来减少Java应用的启动时间和内存占用。

2024-08-07 12:47:26 1005

原创 JVM(九)深入解析Java字节码技术与执行模型

这篇文章深入探讨了Java字节码技术,包括字节码的简介、获取字节码清单的方法、解读字节码清单、查看class文件中的常量池信息、查看方法信息、线程栈与字节码执行模型、方法体中的字节码解读、对象初始化指令、栈内存操作指令、局部变量表、流程控制指令、算术运算指令与类型转换指令、方法调用指令和参数传递,以及JDK7新增的方法调用指令invokedynamic

2024-08-06 16:17:41 1194

原创 JVM(八)深入理解G1 GC(Garbage First)

探讨了G1垃圾回收器,一种在Java虚拟机中用于老年代垃圾回收的算法。G1的设计目标是减少停顿时间,适用于对延迟敏感的应用。它通过多个阶段实现垃圾回收,包括初始标记、并发标记、重新标记和并发清理。文章详细描述了这些阶段的工作原理和G1如何处理内存碎片问题。虽然G1能减少停顿时间,但它也有缺点,如内存碎片、需要预留空间处理浮动垃圾,以及更高的CPU资源消耗。随着新垃圾回收器如ZGC的出现,G1的使用正在逐渐减少,但对于运行在Java 8及以下版本的应用,G1的优化仍然重要。

2024-08-06 14:16:48 1792

原创 JVM(七)深入理解CMS垃圾收集器( Mostly Concurrent Mark and Sweep Garbage Collector)

本文主要深入讲解了CMS垃圾回收器,一种在Java虚拟机中用于老年代垃圾回收的算法。CMS的设计目标是减少停顿时间,适用于对延迟敏感的应用。它通过多个阶段实现垃圾回收,包括初始标记、并发标记、重新标记和并发清理。文章详细描述了这些阶段的工作原理和CMS如何处理内存碎片问题。虽然CMS能减少停顿时间,但它也有缺点,如内存碎片、需要预留空间处理浮动垃圾,以及更高的CPU资源消耗。随着新垃圾回收器如G1和ZGC的出现,CMS的使用正在逐渐减少,但对于运行在Java 8及以下版本的应用,CMS的优化仍然重要

2024-08-06 14:16:16 1037

原创 JVM(六)GC算法(标记、清除、复制、整理、分代、卡片标记、HotSpor垃圾收集器、StopTheWorld(STW))

本文深入解析了Java虚拟机的垃圾回收机制,涵盖了垃圾回收算法、分代垃圾回收策略及不同垃圾回收器的特点。文章首先介绍了标记、清除、复制和整理等基础算法,接着详细阐述了年轻代和老年代在垃圾回收过程中的角色及工作原理。文章还列举了Serial、ParNew、Parallel Scavenge等常见垃圾回收器,分析了它们的优缺点及适用场景。最后,讨论了弱代假设、分配担保等关键概念,强调了减少停顿时间、提高吞吐量在垃圾回收器设计中的重要性。

2024-08-06 14:15:46 736

转载 JVM(五)Parallel GC,CMS GC,G1 GC详解

本文详细介绍了JVM中的几种常见GC算法及其实现,包括串行GC、并行GC、CMS垃圾收集器和G1垃圾收集器。串行GC是单线程的,适合小规模应用,而并行GC通过多线程提高吞吐量,但可能导致长时间停顿。CMS GC旨在减少老年代回收时的停顿,通过并发标记和清除阶段减少STW时间,但可能产生内存碎片。G1 GC的目标是实现可预期的停顿时间,通过将堆划分为多个小块并优先回收垃圾最多的区域,G1在并发阶段估算存活对象并执行增量回收,减少停顿时间。G1还引入了Remembered Sets来优化独立回收。

2024-08-06 14:15:03 1435

原创 jvm运行时常量池溢出的原因

Java虚拟机(JVM)的运行时常量池(Runtime Constant Pool)是方法区的一部分,用于存储类和接口的常量池表,包括字面量和对类型、字段和方法的符号引用。:如果JVM启动参数中设置了较大的方法区(如-XX:MaxPermSize或-XX:MetaspaceSize),那么常量池的大小也会相应增大,这可能会延迟溢出发生的时间,但如果不合理地设置过大,也可能会导致溢出。:动态代理同样会生成新的类信息,这些信息会被放入常量池,如果动态代理使用不当,也可能导致常量池溢出。

2024-08-06 10:20:30 320

原创 JVM(四)垃圾收集器GC的原理

本文深入探讨了Java虚拟机(JVM)中的垃圾收集(GC)机制,阐释了GC的基本概念、工作原理和多种算法。文章首先指出了手动内存管理的不足,随后介绍了引用计数法的局限性。接着,文章详细描述了JVM采用的标记-清除(Mark and Sweep)算法,包括标记阶段的STW(Stop The World)停顿和清除阶段的内存碎片问题。为了解决这些问题,提出了碎片整理和分代假设的概念,将JVM内存划分为年轻代和老年代,并根据不同代的特点采用不同的GC策略。

2024-08-05 20:33:59 803

原创 JVM(三)JVM如何完成垃圾回收

但无论使用哪种垃圾回收器,我们的编码方式还是会影响垃圾回收的效果,减少对象的创建,及时切断与不再使用对象的联系,是我们平常编码中一定要注意的。这就是程序计数器的功能。JVM 的垃圾回收器更新很快,也有非常多的 JVM 版本,比如 Zing VM、Dalvik,目前被广泛应用的是 Hotspot,提供了海量的配置参数来支持我们的性能微调。如 JVM 内存区域划分图所示,JVM 中占用内存最大的区域,就是堆(Heap),我们平常编码创建的对象,大多数是在这上面分配的,也是垃圾回收器回收的主要目标区域。

2024-08-05 19:02:48 922

原创 JVM(二)哪些区域可能发生OOM(OutOfMemoryError)

同理,在一个时间点,对应的只会有一个活动的栈帧,通常叫作当前帧,方法所在的类叫作当前类。毕竟理论上的视角和现实中的视角是有区别的,规范侧重的是通用的、无差别的部分,而对于应用开发者来说,只要是 Java 进程在运行时会占用,都会影响到我们的工程实践。今天是 JVM 内存部分的第一讲,算是我们先进行了热身准备,我介绍了主要的内存区域,以及在不同版本 Hotspot JVM 内部的变化,并且分析了各区域是否可能产生 OutOfMemoryError,以及 OOME 发生的典型情况。

2024-08-05 18:47:49 980

原创 JVM中,直接内存和本地内存有什么区别?

直接内存是与JVM堆内存不同的内存区域,用于存储直接缓冲区,目的是提高I/O操作的性能。本地内存是指操作系统管理的内存,包括JVM的非堆内存部分,用于存储JVM的内部结构和运行时数据。理解这两者的区别对于性能调优和内存管理非常重要,特别是在处理大量数据或进行系统级编程时。

2024-08-05 16:16:01 715

原创 JVM(一)JVM和JMM内存模型

JVM 支持程序多线程执行,每个线程是一个Thread,如果不指定明确的同步措施,那么多个线程在访问同一个共享变量时,就看会发生一些奇怪的问题,比如 A 线程读取了一个变量 a=10,想要做一个只要大于9就减2的操作,同时 B 线程先在 A 线程操作前设置 a=8,其实这时候已经不满足 A 线程的操作条件了,但是 A 线程不知道,依然执行了 a-2,最终 a=6;实际上 a 的正确值应该是 8,这个没有同步的机制在多线程下导致了错误的最终结果。

2024-08-05 14:32:10 1831

原创 Java中基本数据类型包装类的常量池缓存的值得范围是多少?

如果我们使用的装箱的方式创建值为缓存范围内的对象,他会返回缓存区的对应的对象,比如Integer i = 10,就会返回缓存区中的对象,而Integer i = 1000就会在堆区创建对象。这个缓存主要用于存储一定范围内的实例,以便快速重复利用这些对象,减少内存消耗。等,也有类似的缓存机制,但具体的缓存值范围可能不同,并且可能会受到JVM实现的影响。例如,在一些JVM实现中,值时,JVM会从缓存中返回一个已经创建的实例,而不是每次都创建一个新的实例。,那么每次都会创建一个新的对象,而不会使用缓存中的实例。

2024-08-05 14:09:49 367

原创 Java类被加载到内存时,元信息和常量池都去哪了

综上所述,类的元信息确实被加载到JVM的方法区(在Java 8及以后是元空间),而常量池被加载到运行时常量池中。这些信息为类的实例化和运行时行为提供必要的元数据支持。

2024-08-05 13:52:45 326

原创 GitHub无法识别Markdown的目录

下载下来之后,发现没有后缀名无法识别,实际上这是个exe文件,所以只需要暴力地在后面加上.exe就可以开始愉快使用了。首先将README.md文档复制到gh-md-toc.exe的根目录下。接下来只需将这段话复制粘贴到README.md里面即可。打开Powershell窗口后,直接键入。可以直接下载编译好的二进制文件。接着按住shift键同时右击。

2024-08-05 13:35:42 306

原创 Java后端面试复习7.24

lock加锁解锁尝试获取锁方法 lock底层基于什么实现 lock和lock的底层实现分别面向什么用户 lock和synchronized异同 如何选择合适的锁 ReentrantLock如何实现冲入 内部类三个 公平和非公平获取锁怎么实现的 RL默认公平还是非公平,构造参数 ReentrantRedaWriteLock的特性 什么是AQS,内部属性 AQS的设计模式,三类方法和对应作用 实现自定义锁步骤 同步队列的实现,入队出对 非公平所在队列中的竞争 读写锁获取两个锁的方法

2024-08-03 22:56:52 428

原创 Java后端面试复习7.23

进程和线程 线程优先级 线程状态 线程构造方式三种 推荐用哪种为什么 线程中断调用什么方法,本线程怎检查 为什么线程不应强制停止 线程通信方式四种 ThreadLocal FUtureTask 线程礼让 终止线程的另一个缺陷(锁) 守护线程 什么时候设置为守护县城 sleep,yieldjoin的区别 能否按照优先级严格执行 THreadlocal的例子Simpledataformat Threadlocal的弱引用 解决map冲突 内存泄露,怎么解决 域名分片 短

2024-08-03 22:55:15 523

原创 Java中,synchronized修饰的静态方法会对整个对象加锁,这个是怎么实现的?

当多个线程同时调用同一个类的静态方法时,JVM会使用这个监视器来确保只有一个线程可以进入方法内部。如果另一个线程试图在第一个线程正在执行方法时进入该方法,它会进入阻塞状态,直到第一个线程完成方法执行并释放监视器。这种实现方式的好处是,它可以确保所有对静态资源的访问都是线程安全的,而不需要为每个对象实例创建额外的同步机制。当一个静态方法被同步时,JVM会在。这意味着当多个线程同时调用这个方法时,只有一个线程可以执行方法体,确保了。关键字修饰时,它会锁定整个类,而不是对象实例。对象,这个对象在类加载时被创建。

2024-08-02 19:19:39 314

原创 阻塞队列BlockingQueue是如何唤醒等待的线程的呢?

当队列状态改变时(例如,生产者添加了一个元素或消费者取出一个元素),相应的条件会被信号唤醒,这样等待的线程就可以重新获取锁并继续执行。这将导致消费者线程释放锁并等待,直到另一个线程(生产者)在队列中插入一个元素并调用。这个锁用于同步对队列的访问,确保在任何时刻只有一个线程可以修改队列。: 当生产者向队列中添加一个元素时,它会调用。方法来唤醒一个(或所有)等待的消费者线程。: 当队列为空时,消费者线程会调用条件。: 队列内部维护了一个锁,通常是。条件用于通知消费者队列非空,而。方法来唤醒等待的消费者线程。

2024-08-02 12:58:11 539

原创 win10桌面任务栏美化(不用软件)(任务栏应用居中,透明任务栏)

4、寻找文件(这是按首字母排列)TaskbarAcrylicOpacity,如果没有,就在Advanced目录下创建一个该名字的文件,新建选择32-DWORD(32位)值D;6、关闭注册表编辑器,右键任务栏打开任务管理器,(左下角要是详细信息),找到Windows资源管理器,右键重启(有几个重启几个),有黑屏一下就对了。5、右键修改,选择10进制,将值改为0,即为全透明,设置0~10为从透明到不透明;1、打开设置——个性化——颜色,打开透明效果;2、在搜索框搜索注册表编辑器;

2024-08-01 11:24:49 919

原创 Java中通过管道进行线程间交流

在Java中,线程间的通信可以通过多种方式实现,其中一种方式是通过管道(Piped Streams)。管道是一种在两个线程之间进行数据传输的机制,它允许一个线程通过一个输出流发送数据,而另一个线程通过相应的输入流接收数据。请注意,管道流主要用于线程间的简单通信,并且它们不是为高并发设计的。如果需要处理更复杂的线程间通信,可能需要使用。包中的高级并发工具,如。

2024-08-01 10:59:38 233

原创 什么是Java并发中的锁池?

在Java并发编程中,锁池(Lock Pool)是一个与线程的同步机制相关的概念。

2024-08-01 10:45:26 312

原创 Java中的各种运算符的优先级

请注意,当一个表达式中包含多个运算符时,这些运算符将按照上述优先级顺序进行计算。如果有多个运算符具有相同的优先级,它们将从左到右进行计算。在 Java 中,运算符的优先级决定了它们在表达式中结合的方式。在编写代码时,了解运算符的优先级对于避免意外的计算结果非常重要。如果你在编写复杂的表达式,可能需要使用括号来明确指定运算的顺序。,它们既可以作为算术运算符,也可以作为赋值运算符。在这种情况下,它们作为算术运算符的优先级高于作为赋值运算符的优先级。此外,还有一些运算符,如。

2024-07-31 21:00:08 488

原创 操作系统中1号进程是什么

init进程负责管理系统中的其他进程,包括启动、监控和终止系统上的进程。而当父进程被终止时,该父进程的子进程就变为孤儿进程,会被 1 号进程收养,并由 1 号进程对它们完成状态收集工作。init进程是系统进程管理的关键部分,它确保了即使在父进程意外终止的情况下,系统中的进程仍然可以被妥善管理。:一旦孤儿进程结束运行,init进程负责回收它们使用的系统资源,确保系统资源得到合理分配和使用。:init进程会监控这些孤儿进程的状态,当它们终止时,init进程会收集它们的退出状态。以下回答来自Kimi。

2024-07-31 20:06:46 418

原创 Java并发(十八)美团的线程池实际应用场景

面对业务中使用线程池遇到的实际问题,我们曾回到支持并发性问题本身来思考有没有取代线程池的方案,也曾尝试着去追求线程池参数设置的合理性,但面对业界方案具体落地的复杂性、可维护性以及真实运行环境的不确定性,我们在前两个方向上可谓“举步维艰”。最终,我们回到线程池参数动态化方向上探索,得出一个且可以解决业务问题的方案,虽然本质上还是没有逃离使用线程池的范畴,但是在成本和收益之间,算是取得了一个很好的平衡。

2024-07-31 17:57:49 361

原创 Java并发(十七)Java线程池的最佳实践(实际业务场景)

*CPU 密集型任务:**这种任务消耗的主要是 CPU 资源,可以将线程数设置为 N(CPU 核心数)+1,比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。综合来看,我们可以根据自己的业务场景,从“N+1”和“2N”两个公式中选出一个适合的,计算出一个大概的线程数量,之后通过实际压测,逐渐往“增大线程数量”和“减小线程数量”这两个方向调整,然后观察整体的处理时间变化,最终确定一个具体的线程数量。通过测试结果,我们可以看到每个线程所花费的时间。

2024-07-31 17:57:05 1029

原创 Java并发(十六)一文搞懂Java 线程池原理

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。Executor- 运行任务的简单接口。- 扩展了Executor接口。扩展能力:支持有返回值的线程;支持管理线程的生命周期。- 扩展了接口。扩展能力:支持定期执行任务。接口的默认实现。- Executor 框架最核心的类,它继承了类。接口的实现,一个可定时调度任务的线程池。Executors- 可以通过调用Executors的静态工厂方法来创建线程池并返回一个对象。

2024-07-31 17:55:41 1139

原创 goroute和Java线程池哪个性能更好

在比较 Go 语言的goroutine和 Java 中的线程池()时,性能是一个复杂的话题,因为性能取决于多种因素,包括任务类型、任务数量、系统资源等。

2024-07-31 17:26:22 480

原创 核心线程创建之后是否受keepAliveTime影响?

是指在非核心线程空闲时,它们会等待新任务的最长时间。一旦超过这个时间,如果仍然没有新任务提交,非核心线程会被终止。类中,核心线程(core threads)在创建线程池时被创建,并且它们在空闲时会一直保持运行状态,直到被。默认情况下,核心线程不会被回收,除非线程池被关闭或者线程池的。对于核心线程,它们在创建线程池时被创建,并且在。设置的时间到期而被回收,除非线程池被关闭或者。设置的时间内保持活跃。核心线程的存活时间(

2024-07-31 15:17:51 379

原创 什么是工厂模式?Java中哪里用到了工厂模式?

工厂模式是一种创建型设计模式,用于创建对象而无需指定其具体的类。在工厂模式中,我们定义一个接口用于创建对象,但让具体的实现延迟到子类中。这样,客户端可以创建对象,而无需关心对象的创建细节。在 Java 中,工厂模式通常用于创建对象,特别是在需要创建多种类型的对象时。方法,该方法根据传入的类型创建相应的动物对象。在这个例子中,我们定义了一个。

2024-07-31 15:08:27 223

原创 postman接口测试教程

之前还没实际做过接口测试的时候呢,对接口测试这个概念比较渺茫,只能靠百度,查看各种接口实例,然后在工作中也没用上,现在呢是各种各样的接口都丢过来,总算是有了个实际的认识。因为只是接口的功能测试,所以目前是用postman做测试,比较简便,当然这只是接口测试的入门而已,了解的只是冰山一角,后续会努力往接口压力、接口性能、接口自动化方向靠拢。

2024-07-31 13:59:47 855

原创 ExecutorService 接口execute 方法和 submit 方法有什么区别

方法提交了一个不需要返回结果的任务,然后使用。方法提交了一个需要返回结果的任务,并获取了。最后,我们关闭了线程池。下面是一个简单的示例,展示了。在这个例子中,我们首先使用。以下回答来自智谱清言。

2024-07-31 13:41:00 563

原创 操作系统(六)进程比线程大在哪里

本讲我们学习了进程和线程的基本概念。了解了操作系统如何调度进程(线程)和分时算法的基本概念,然后了解进程(线程)的 3 种基本状态。线程也被称作轻量级进程,由操作系统直接调度的,是内核级线程。我们还学习了线程切换保存、恢复状态的过程。我们发现进程和线程是操作系统为了分配资源设计的两个概念,进程承接存储资源,线程承接计算资源。而进程包含线程,这样就可以做到进程间内存隔离。这是一个非常巧妙的设计,概念清晰,思路明确,你以后做架构的时候可以多参考这样的设计。

2024-07-30 21:45:47 476

原创 Java并发(十五)Java并发工具类

和都能够实现线程之间的等待,只不过它们侧重点不同:一般用于某个线程 A 等待若干个其他线程执行完任务之后,它才执行;一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;另外,是不可以重用的,而是可以重用的。Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。

2024-07-30 21:20:37 429

原创 Java并发(十四)Java原子类

保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。确保线程安全最常见的做法是利用锁机制(Lock)来对共享数据做互斥同步,这样在同一个时刻,只有一个线程可以执行某个方法或者某个代码块,那么操作必然是原子性的,线程安全的。互斥同步最主要的问题是线程阻塞和唤醒所带来的性能问题。volatile是轻量级的锁(自然比普通锁性能要好),它保证了共享变量在多线程中的可见性,但无法保证原子性。所以,它只能在一些特定场景下使用。

2024-07-30 21:20:01 417

左神算法中级班笔记哦.md

适合ybw

2021-11-02

Mybatis基础知识整合

Mybatis基础知识,使用方法,视频为b站狂神说java的mybatis

2021-08-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除