JAVA基础
文章平均质量分 87
Big Skipper
The Chosen One.
展开
-
JAVA 虚拟机架构
在我看来,不管学习什么样的知识或技术,首先要做的就是从全局上去认识它,这样才能避免盲人摸象,事倍功半的情况发生。既然要学习 JVM,就要先了解它的整体架构,于是我画了个 JVM 架构图来帮助大家认识它。对 JVM 还不太了解的同学第一次看到这张花里胡哨的图肯定会一脸懵逼,不用怕,其实我们只需要重点理解并掌握其中一部分 (同时也是面试重点) 就好了,比如运行时数据区、垃圾收集器、内存分配策略和类加载机制等,类文件结构也可以学习一下,其他的稍作了解即可。...原创 2022-08-28 22:06:39 · 724 阅读 · 0 评论 -
JVM 基础 - 类字节码详解
一 多语言编译为字节码在JVM运行计算机是不能直接运行java代码的,必须要先运行java虚拟机,再由java虚拟机运行编译后的java代码。这个编译后的java代码,就是本文要介绍的java字节码。为什么jvm不能直接运行java代码呢,这是因为在cpu层面看来计算机中所有的操作都是一个个指令的运行汇集而成的,java是高级语言,只有人类才能理解其逻辑,计算机是无法识别的,所以java代码必须要先编译成字节码文件,jvm才能正确识别代码转换后的指令并将其运行。Java代码间接翻译成字节码,储存字节原创 2021-10-24 22:14:45 · 2839 阅读 · 0 评论 -
JUC 工具类之 Exchanger 详解
一 Exchanger 简介线程间的数据共享除了定义一个共享数据然后各个线程去访问这种方式外,还可以使用 Exchanger 交换数据。Exchanger——交换器,是 JDK1.5 时引入的一个同步器,从字面上就可以看出,这个类的主要作用是:进行两个线程之间的数据交换。Exchanger 有点类似于 CyclicBarrier,我们知道 CyclicBarrier 是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。Exchanger 可以看成是一个双向栅栏,如下图:Th原创 2021-09-13 16:52:02 · 727 阅读 · 0 评论 -
JUC 工具类之 CyclicBarrier 详解
一 概述上一篇我们讲了 CountDownLatch 可以解决多个线程同步的问题,相比于 join 来说它的应用范围更广,不仅可以应用在线程上,还可以应用在线程池上。然而 CountDownLatch 却是一次性的计数器,以王者农药来说,咱们不可能一场团战就决定比赛的输赢,所以在某些场景下,咱们是需要重复使用某个等待功能的,这就是我们今天要介绍的另一个主角——CyclicBarrier。二 CyclicBarrier 概念CyclicBarrier 翻译为中文是循环(Cyclic)栅栏(Barrie原创 2021-09-12 13:18:21 · 344 阅读 · 0 评论 -
JUC 工具类之 CountDownLatch 详解
一 提出一个问题如何实现让主线程等所有子线程执行完了后,主要线程再继续执行?即如何实现一个线程等其他线程执行完了后再继续执行?1.1 join 解决方案在前面的文章中我们介绍了 Thread 类的 join 方法,join 的工作原理是,不停检查 thread 是否存活,如果存活则让当前线程永远 wait,直到 thread 线程终止,线程的 notifyAll 就会被调用。下面我们就使用 join 来实现上面的问题。import java.util.Random;import java.uti原创 2021-09-11 18:31:21 · 492 阅读 · 0 评论 -
JUC工具类之 Semaphore 详解
一 概述1.1 Semaphore 是什么Semaphore 一般译作 信号量,它是一种线程同步工具,主要用于多个线程对共享资源进行并行操作的一种工具类。它代表了一种许可的概念,是否允许多线程对同一资源进行操作的许可,使用 Semaphore 可以控制并发访问资源的线程个数。1.2 Semaphore 的使用场景Semaphore 的使用场景主要用于流量控制,比如数据库连接,同时使用的数据库连接会有数量限制,数据库连接不能超过一定的数量,当连接到达了限制数量后,后面的线程只能排队等前面的线程释放数据原创 2021-09-10 23:39:22 · 387 阅读 · 1 评论 -
JUC 锁之 LockSupport 详解
一 概述今天我们来介绍 Java 并发编程系列之 LockSupport,在介绍 Synchronized 的时候我们有提过,不推荐同学们使用 Object 的 wait、notify、notifyAll 等函数做多线程间的通信协同,使用 LockSupport 会是更好的选择,本篇就来谈谈 LockSupport,也正好为下篇的 AQS(AbstractQueuedSynchronized)打基础。二 LockSupport 概念LockSupport 是线程工具类,主要作用是阻塞和唤醒线程,底层原创 2021-09-09 14:34:01 · 537 阅读 · 0 评论 -
JUC 锁之 ReentrantReadWriteLock 详解
一 概述ReentrantReadWriteLock(后面简称 RRW),我们一般称之为读写锁,主要使用在:读多写少的场景。1.1 读写锁规范作为合格的读写锁,先要有读锁与写锁才行。所以声明了 ReadWriteLock 接口,作为读写锁的基本规范。之后都是围绕着规范去实现读锁与写锁。1.2 读锁与写锁ReadLock 与 WriteLock 就是读锁和写锁,它们是 RRW 实现 ReadWriteLock 接口的产物。但读锁、写锁也要遵守锁操作的基本规范.所以 WriteLock 与原创 2021-09-08 18:43:09 · 287 阅读 · 0 评论 -
Synchronized 与 ReentrantLock 的区别
工作中我们经常会遇到 Java 常见的加锁方法,本文着重介绍最常见的 synchronized 与 ReentrantLock 的区别,以及说明在动态高并发时为什么推荐 ReentrantLock 而不是 Synchronized?一 Synchronized 与 ReentrantLock 的区别1.1 底层实现的区别底层实现上来说,synchronized 是 JVM 层面的锁,是 Java 关键字,通过 monitor 对象来完成(monitorenter 与 monitorexit),对象只有原创 2021-09-07 18:56:29 · 7377 阅读 · 2 评论 -
JUC 锁之 ReentrantLock 详解
一 概述先提出一些问题:什么是可重入,什么是可重入锁? 它用来解决什么问题?ReentrantLock的核心是AQS,那么它怎么来实现的,继承吗? 说说其类内部结构关系。ReentrantLock是如何实现公平锁的?ReentrantLock是如何实现非公平锁的?ReentrantLock默认实现的是公平还是非公平锁?使用ReentrantLock实现公平和非公平锁的示例?ReentrantLock和Synchronized的对比?接下来对 ReentrantLock 的分析,我们会一原创 2021-09-05 23:10:14 · 299 阅读 · 0 评论 -
JUC 原子类之 CAS,Unsafe 和原子类详解
一 CAS前面我们说到,线程安全的实现方法包含:互斥同步: synchronized 和 ReentrantLock非阻塞同步: CAS,AtomicXXXX无同步方案: 栈封闭,Thread Local,可重入代码1.1 什么是 CASCAS 的全称为 Compare-And-Swap,直译就是对比交换。是一条 CPU 的原子指令,其作用是让 CPU 先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说 CAS 是靠硬件实现的,JV原创 2021-09-04 21:03:57 · 528 阅读 · 0 评论 -
JUC - 类汇总和学习指南
一 概述我们先来看下 JUC 的包括那些部分:Lock 框架和 Tools 类 (把图中这两个放到一起理解)Collections: 并发集合Atomic: 原子类Executors: 线程池二 Lock 框架和 Tools 类2.1 类结构总览2.2 接口:ConditionCondition 为接口类型,它将 Object 监视器方法 (wait、notify 和 notifyAll) 分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等原创 2021-09-04 17:09:06 · 318 阅读 · 1 评论 -
Java final 详解
一 final 基础使用1.1 修饰类当某个类的整体定义为 final 时,就表明了你不能打算继承该类,而且也不允许别人这么做。即这个类是不能有子类的。注意:final 类中的所有方法都隐式为 final,因为无法覆盖他们,所以在 final 类中给任何方法添加 final 关键字是没有任何意义的。这里顺道说说 final 类型的类如何拓展? 比如 String 是 final 类型,我们想写个 MyString 复用所有 String 中方法,同时增加一个新的 toMyString() 的方法,应原创 2021-09-03 18:26:11 · 16295 阅读 · 2 评论 -
Java 内存模型详解
一 基础1.1 并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写 - 读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共原创 2021-09-02 23:17:06 · 166 阅读 · 0 评论 -
Java 并发知识体系和理论基础
一 概述对于一个 Java 程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是 Java 语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。尤其是大数据时代的来临,高并发更成为了家常便饭,工作中,你总是绕不开并发编程的任务,比如说,你想写个程序,一边从文件中读取数据,一边还要做实时计算…所以,想成为一名资深的 Java 后端工程师,并发编程必须要牢牢把握。二 知识体系三 理论基础3.1 为什么需要多线程?众所周原创 2021-08-31 18:53:19 · 275 阅读 · 0 评论 -
Java 锁系列
一 概述Java 提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自 JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java 中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:二 乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在 Java 和数据库中都有原创 2021-08-31 00:02:34 · 397 阅读 · 4 评论 -
AbstractQueuedSynchronizer(AQS) 原理
一 概述1.1 AQS 是什么?AQS (AbstractQueuedSynchronizer,抽象队列同步器) 是并发开发中的一个基础组件,是一个用于构建锁和同步器的框架,许多同步器都可以通过 AQS 很容易并且高效地构造出来。 在 JDK 中,不仅 ReentrantLock (可重入锁) 和 Semaphore (信号量) 是基于 AQS 构建的,还包括 CountDownLatch (计数器)、ReentrantReadWriteLock、SynchronousQueue 和 FutureTas原创 2021-08-30 18:43:33 · 378 阅读 · 0 评论 -
Java Executor 框架
一 概述我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等。线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从 JDK1.5 开始,为了把工作单元与执行机制分离开,Executor 框架诞生了,他是一个用于统一创建与运行的接口。Executor 框架实现的就是线程池的功能。线程的工作单位是 Runnable 和 Callable,执行机制由 Executor 框架提供。二 Executor 框架2.1 Executor 框架的两级调度在上层,原创 2021-08-27 17:58:37 · 232 阅读 · 0 评论 -
java 并发之 this 逃逸
一 概述《java并发编程实践》的第三章,对象的发布和逸出,作者提到了2种常见的对象逸出情况:在构造函数中注册事件监听在构造函数中启动新线程示例代码如下:public class ThisEscape { public ThisEscape(EventSource source) { source.registerListener( new EventListener() { public void onEvent原创 2021-08-27 16:21:08 · 448 阅读 · 0 评论 -
Java 线程池原理
一 概述随着计算机行业的飞速发展,摩尔定律逐渐失效,多核 CPU 成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C 提供的线程池 ThreadPoolExecutor 类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述了线程池概念和用途,接着结合线程池的源码,帮助大家领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。1.1 线程池是什么线程池(Thread原创 2021-08-26 18:46:35 · 335 阅读 · 0 评论 -
CAS 原理
一 概述我们讲了 N 篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大 BOSS:CAS 无锁算法,可谓是并发编程核心中的核心!温故首先我们再回顾一下原子性问题的原因,参考【漫画】JAVA并发编程 如何解决原子性问题。两个线程同时把 count=0 加载到自己的工作内存,线程 B 先执行 count++ 操作,此时主内存已经变化成了 1,但是线程 A 依旧以为 count=0,这是导致问题的根源。所以解决方案就是:不能让线程 A 以为 count=原创 2021-08-25 17:34:22 · 595 阅读 · 0 评论 -
synchronized 实现原理
一 概述1.1 什么是 synchronized 关键字?在多线程的环境下,多个线程同时访问共享资源会出现一些问题,而 synchronized 关键字则是用来保证线程同步的。1.2 java 内存可见性问题在了解 synchronized 关键字的底层原理前,需要先简单了解下 Java 的内存模型,看看 synchronized 关键字是如何起作用的。这里的本地内存并不是真实存在的,只是 Java 内存模型的一个抽象概念,它包含了控制器、运算器、缓存等。同时 Java 内存模型规定,线程对共享原创 2021-08-25 16:31:06 · 1011 阅读 · 0 评论 -
Java 中线程同步锁和互斥锁
一 概述1.1 互斥所谓互斥,就是不同线程,通过竞争进入临界区(共享的数据和硬件资源),为了防止访问冲突,在有限的时间内只允许其中之一独占性的使用共享资源。如不允许同时写。1.2 同步同步关系则是多个线程彼此合作,通过一定的逻辑关系来共同完成一个任务。一般来说,同步关系中往往包含互斥,同时,对临界区的资源会按照某种逻辑顺序进行访问。如先生产后使用。1.3 两者区别总的来说,两者的区别就是:互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。同步是协调多个相互关联线程原创 2021-08-24 23:57:17 · 2656 阅读 · 1 评论 -
Java 多线程并发问题汇总
1、Java 之 ThreadLocal2、Java volatile 详解3、Java Thread.yield4、Java 多线程之 Future 与 FutureTask5、Java 创建线程的3种方式和线程控制6、Java 中 wait 和 sleep 方法的区别7、什么是线程安全8、synchronized、Lock、ReentrantLock、ReadWriteLock9、创建线程池的4种方式10、ThreadPoolExecutor的内部工作原理11、分布式环境下,怎么保证原创 2021-08-22 23:20:49 · 223 阅读 · 0 评论 -
什么是线程安全
并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务。而Java并发则由多线程实现的。在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中。(当然这是比较笼统的说法,线程之间是可以交互的,他们也不一定是串行。)多线程的存在就是压榨cpu,提高程序性能,还能减少一定的设计复杂度(用现实的时间思维设计程序)。这么说来似乎线程就是传说中的银弹了,可事实告诉我们真正的银弹并不存在死锁和脏数据就是典型的线程安全问题。简单来说,线程安全就是: 在多线程环境中,能永原创 2021-08-22 23:16:59 · 427 阅读 · 0 评论 -
Java 中 wait 和 sleep 方法的区别
一 两者的区别这两个方法来自不同的类分别是Thread和Object最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运原创 2021-08-22 23:10:57 · 955 阅读 · 0 评论 -
Java 线程基础
一 进程和线程1.1 什么是进程?进程是处于运行中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的独立单位。1.2 进程的三个特征独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己私有的地址空间。在没有进过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。动态性:进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合,在进程中增加了时间的概念。进程具有自己的生命周期和各种不同的状态,这些概念在程序中都原创 2021-08-22 23:01:43 · 163 阅读 · 0 评论 -
Java 集合遍历之 fail-fast 和 fail-safe
一 快速失败(fail-fast)快速失败(fail-fast)是 java 集合中的一种机制, 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出 Concurrent Modification Exception。原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变 modCount 的值。每当迭代器使用 hashNext() / next() 遍历下一个元素之前,都会原创 2021-08-12 10:32:08 · 125 阅读 · 0 评论 -
Java Thread.yield
一 概述Thread.yield() 方法,使当前线程由执行状态,变成为就绪状态,让出 cpu 时间,在下一个线程执行时候,此线程有可能被执行,也有可能没有被执行。打个比方:现在有很多人在排队上厕所,好不容易轮到这个人上厕所了,突然这个人说:“我要和大家来个竞赛,看谁先抢到厕所!”,然后所有的人在同一起跑线冲向厕所,有可能是别人抢到了,也有可能他自己有抢到了。我们还知道线程有个优先级的问题,那么手里有优先权的这些人就一定能抢到厕所的位置吗? 不一定的,他们只是概率上大些,也有可能没特权的抢到了。JDK原创 2021-08-10 15:49:03 · 100 阅读 · 0 评论 -
ConcurrentHashMap 原理
一 概述我们都知道 HashMap 不是线程安全的,所以在处理并发的时候会出现问题。而 HashTable 虽然是线程安全的,但是是通过整个方法来加锁的方式,当一个线程在写操作的时候,另外的线程则不能进行读写。而 ConcurrentHashMap 则可以支持并发的读写。跟 1.7 版本相比,1.8 版本又有了很大的变化,已经抛弃了 Segment 的概念,虽然源码里面还保留了,也只是为了兼容性的考虑。二 ConcurrentHashMap 原理在 ConcurrentHashMap 中通过一个原创 2021-08-09 23:28:54 · 4856 阅读 · 0 评论 -
Java 集合类问题汇总
1、介绍下 HashMap 的底层数据结构吧在 JDK 1.8,HashMap 底层是由 “数组+链表+红黑树” 组成,如下图所示,而在 JDK 1.8 之前是由 “数组+链表” 组成,就是下图去掉红黑树。2、为什么使用“数组+链表”?使用 “数组+链表” 是为了解决 hash 冲突的问题。数组和链表有如下特点:数组:查找容易,通过 index 快速定位;插入和删除困难,需要移动插入和删除位置之后的节点;链表:查找困难,需要从头结点或尾节点开始遍历,直到寻找到目标节点;插入和删除容易,只需修改原创 2021-08-09 14:18:27 · 324 阅读 · 0 评论 -
HashMap 问题汇总
1、介绍下 HashMap 的底层数据结构答:我们现在用的都是 JDK 1.8,底层是由“数组+链表+红黑树”组成,如下图,而在 JDK 1.8 之前是由“数组+链表”组成。2、为什么要改成“数组+链表+红黑树”?答:主要是为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。3、那在什么时候用链表?什么时候用红黑树?答:对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后达到 9个(阈值8):如果此时数组长度大于等原创 2021-08-08 23:58:06 · 272 阅读 · 0 评论 -
JDK 1.7 HashMap 死循环
一 概述从前我们的 Java 代码因为一些原因使用了 HashMap 这个东西,但是当时的程序是单线程的,一切都没有问题。后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现程序经常占了 100% 的 CPU,查看堆栈,你会发现程序都 Hang 在了 HashMap.get() 这个方法上了,重启程序后问题消失。但是过段时间又会来。而且,这个问题在测试环境里可能很难重现。我们简单的看一下我们自己的代码,我们就知道 HashMap 被多个线程操作。而 Java 的文档说 Ha原创 2021-08-08 22:44:09 · 157 阅读 · 0 评论 -
Java 之 hashCode 和 hash 原理
一 概述本文会围绕以下几个点来介绍:什么是 hashCode?为什么说 java离不开 hashCode?hashCode 和 equals 的关系剖析 HashMap 的 hash 算法二 hashCode2.1 为什么会有 hashCode先抛一个结论hashCode 的设计初衷是提高哈希容器的性能抛开 hashCode,现在让你对比两个对象是否相等,你会怎么做?thisObj == thatObjthisObj.equals(thatObj)我想不出第三种了,而且这两种其原创 2021-07-22 17:54:40 · 537 阅读 · 0 评论 -
HashMap 原理
HashMap 是 Java 程序员使用频率最高的用于映射(键值对)处理的数据类型。随着 JDK(Java Developmet Kit)版本的更新,JDK1.8 对 HashMap 底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合 JDK1.7 和 JDK1.8 的区别,深入探讨 HashMap 的结构实现和功能原理。一 概述Java 为数据结构中的映射定义了一个接口 java.util.Map,此接口主要有四个常用的实现类,分别是 HashMap、Hashtable、TreeM原创 2021-07-21 19:09:14 · 173 阅读 · 0 评论 -
Java多线程之Future与FutureTask
一 概述线程的创建方式有两种,一种是实现 Runnable 接口,另一种是继承 Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,于是就有了 Callable 接口,Future 接口与 FutureTask 类的配和取得返回的结果。我们先回顾一下 java.lang.Runnable 接口,就声明了 run(),其返回值为 void,当然就无法获取结果。public interface Runnable { public abstract void run原创 2021-04-07 16:13:56 · 296 阅读 · 1 评论 -
Java虚拟机原理
一 概述我们知道的虚拟机有很多,运行 Java 的 JVM 虚拟机,运行 Android 程序的 Davlik 和 Art 虚拟机,运行 C# 的 CLR 虚拟机,那么什么是虚拟机呢,虚拟机的作用又是什么呢?运行 JavaScript 的 v8 引擎或者运行 Python 的引擎是否也是虚拟机呢?带着这几个问题,我们开始对虚拟机的学习。虽然现在很多人都认为运行 JavaScript 的 V8 或运行 Python 的 VirtualEnv,都不是虚拟机,而是解释器,主要原因是因为 V8 或者 Virtu原创 2021-04-02 11:14:38 · 420 阅读 · 0 评论 -
Java volatile详解
一 简介volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。二 并发编程的3个基本概念1.原子性定义: 即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原创 2021-03-29 17:21:10 · 1037 阅读 · 2 评论 -
Java之ThreadLocal
一 概述当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了。数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的技术称为线程封闭。本文主要介绍线程封闭中的其中一种体现:ThreadLocal,将会介绍什么是 ThreadLocal;从 ThreadLocal 源码角度分析,最后介绍 ThreadLocal 的应用场景。二 什么是 ThreadLocalThreadLocal 是 Java 里一种特殊变量,原创 2021-03-26 16:58:03 · 204 阅读 · 0 评论 -
Java之JVM
一 JVM的主要组成部分及其作用JVM 包含两个子系统和两个组件,两个子系统为 Class loader (类装载)、Execution engine (执行引擎);两个组件为 Runtime data area (运行时数据区)、Native Interface (本地接口)。Class loader (类装载):根据给定的全限定名类名 (如:java.lang.Object) 来装载 class 文件到 Runtime data area 中的 method areaExecution eng原创 2021-03-23 23:19:39 · 196 阅读 · 0 评论