
《程序员面试》系列
文章平均质量分 87
java全套知识点,你要的这里都有,没有的你尽管说,我来更!
李子捌
优快云博客专家、InfoQ 100大签约作者、阿里云博客专家、华为云专家
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Redis高频面试题汇总(2021最新版)
本文已收录于专栏上千人点赞收藏,全套Redis高频面试题,大厂必备技能!面试官心理分析从面试官的角度分析,出这道题的目的是为了考察你对缓存的认知水平,以及结合缓存处理业务、改善架构的能力。这道题很明显是让你自由发挥,给了你引领面试官往自己最熟悉的知识点引导的机会,所以要尽可能的把握这次机会,给面试官一个好的印象。这道题聊得好,就是能深入交流个把小时了,如果是一面基本上能轻轻松松拿下。 但是千万不要上来就把话题聊死了,聊太浅了,那基本就是回去等通知了…… 比如以下这种回答方式:...原创 2021-10-15 08:00:00 · 2164 阅读 · 17 评论 -
最基础的ASCII、Unicode、UTF-8一起来多了解点
ASCII简介ASCII(American Standard Code for Information Interchange-美国信息交换标准代码),是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,到目前为止定义了128个字符。产生原因在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如52个英文字母、1-9的数字、常用的一些字符在计算机中存储时也需要使用二进制来表示,而具体使用什么样的二进制来表原创 2021-06-02 22:36:59 · 1025 阅读 · 3 评论 -
深入剖析大厂经典面试题之ThreadLocal原理(涉及斐波拉契散列、线性探测、扩容以及内存泄露问题)
1、简介ThreadLocal也称线程变量,它是一个以ThreadLocal对象为键、任意对象为值的存储结构(ThreadLocal中ThreadLocalMap的Entry结构),这个结构会被附带在线程上,以此来做线程数据的隔离。ThreadLocal是维持线程的封闭性的一种规范,它提供set()/get()等方法维护和访问线程中存储的私有副本,ThreadLocal通常用于防止对可变的单实例变量或者全局变量进行共享。ThreadLocal和synchronized两者经常会被拿出来一起讨论,虽然二者原创 2021-07-03 18:21:55 · 1060 阅读 · 10 评论 -
this与super关键字(阿里巴巴面试竟然问道这个了……今天把它盘透彻了!)
1、简介this与super是类实例化时通往Object类通道的打通者;this和super在程序中由于其经常被隐式的使用而被我们忽略,但是理解其作用和使用规范肯定是必须的。接下来将详述this与super的作用和区别。2、引子先来看两段代码,无报错代码示例:package com.liziba.ts;/** * <p> * 父类示例代码 * </p> * * @Author: Liziba */public class Father { p原创 2021-07-02 13:18:40 · 686 阅读 · 9 评论 -
Java中各种死锁详细讲述及其解决方案(图文并茂,浅显易懂)
1、简介在遇到线程安全问题的时候,我们会使用加锁机制来确保线程安全,但如果过度地使用加锁,则可能导致锁顺序死锁(Lock-Ordering Deadlock)。或者有的场景我们使用线程池和信号量来限制资源的使用,但这些被限制的行为可能会导致资源死锁(Resource DeadLock)。这是来自Java并发必读佳作 Java Concurrency in Practice 关于活跃性危险中的描述。我们知道Java应用程序不像数据库服务器,能够检测一组事务中死锁的发生,进而选择一个事务去执行;在Java程原创 2021-07-01 22:51:46 · 3863 阅读 · 76 评论 -
java并发之Condition图解与原理剖析
1、Condition定义Condition是一个接口,定义在juc中(java.util.concurrent.locks.Condition),它的主要功能类似于wait()/notify(),但是Condition其实现比wait()/notify()使用更加灵活,简洁、适用场景更加丰富。2、Condition之于Lock与wait()/notify()之于synchronized2.1 wait()/notify()之于synchronizedjava.lang.Object中定义了一原创 2021-06-26 22:46:57 · 1853 阅读 · 27 评论 -
interrupted()和isInterrupted()详述
有经典,有干货,微信搜索【李子捌】关注这个爱好广泛的程序员。前言当提及如何终止一个线程时,部分读者通常立马想到的方法肯定是stop(),但是stop()方法并不被推荐使用(很多规范中是禁止使用的),其原因是强制终止一个线程,会导致程序不正常的结束,会出现资源未正确释放、程序结果不正确等等问题。而是否终止一个线程应该把这个控制权转交给当前被终止的线程本身,此时采用的办法就是** **interrupt()方法来终止,该方法相当于修改一个共享变量的值,当运行中的线程判断当前值为false则继续运行,如.原创 2021-06-24 15:24:26 · 480 阅读 · 2 评论 -
读写锁-ReentrantReadWriteLock源码分析与图解
有经典,有干货,微信搜索【李子捌】关注这个每日推送经典的程序员。为何要有读写锁ReentrantLock锁和其他锁基本上都是排他锁,排他锁指的是在同一时刻只允许一个线程持有锁,访问共享资源。虽然ReentrantLock支持同一个线程重入,但是允许重入的是同一个线程。因此ReentrantReadWriteLock是为了支持多个线程在同一个时刻对于锁的访问孕育而生的。读写锁—简单介绍读写锁ReentrantReadWriteLock允许多个线程在同一时刻对于锁的访问。但是,写线程获取写锁时.原创 2021-06-24 00:08:10 · 503 阅读 · 4 评论 -
for(;;)和while(true)的区别
有经典,有干货,微信搜索【李子捌】关注这个每日更新的程序员。问题来源在阅读Java的JDK源码时,发现大部分写源码的大佬多采用for(;;)的方式来死循环,比如说AQS(AbstractQueuedSynchronizer)中大量使用的自旋的方式获取共享状态。源码示例/** * 通过“死循环”的方式来正确的添加节点 */private Node enq(final Node node) { // 不断循环,直至CAS插入节点成功 for (;;) { .原创 2021-06-22 08:47:42 · 550 阅读 · 0 评论 -
详述重入锁-ReentrantLock
有经典,有干货,微信搜索【李子捌】关注这个每日更新的程序员。简介重入锁ReentrantLock指的是支持同一个线程对资源的重复加锁。ReentrantLock中有公平锁和非公平锁的两种实现。synchronizedsynchronized关键字支持隐式的重入;当一个线程获取到锁时,是支持这个线程多次获取这个锁的,不会出现自己阻塞自己的情况,并且我们开发过程中对于synchronized关键字也不需要关心锁的释放。举个递归的例子我们来看synchronized关键字对锁的重入。代码示.原创 2021-06-22 00:47:41 · 532 阅读 · 2 评论 -
AQS(AbstractQueuedSynchronizer)——源码分析
有经典,有干货,微信搜索【李子捌】关注这个每日更新的程序员。简介AbstractQueuedSynchronizer(队列同步器),是用来构建锁或者其他同步组件的基础框架,它通过使用一个int类型的变量来表示同步状态的同时内置FIFO队列来完成资源获取线程的排队工作,AbstractQueuedSynchronizer是大部分同步需求实现的基础。1、Lock接口在学习AbstractQueuedSynchronizer之前,先了解一下Lock接口。了解Lock接口之前呢,先了解一下什么是.原创 2021-06-21 00:15:42 · 478 阅读 · 4 评论 -
基于线程池手写一个简单web服务器并且顺带学会web服务基准测试工具ab?
有经典,有干货,微信搜索【李子捌】关注这个每日更新的程序员。简介:目前浏览器作为web服务的客户端访问者,都支持并发多线程的访问。例如在浏览器访问一个web服务器上的HTML页面,此时HTML页面中的各种资源(图片、样式)会被浏览器并发的获取,这种并发访问使得用户不至于等待图片加载的同时也不能看到文字内容。客户端既然是多线程并发访问,那么如果服务端仅仅是单线程处理客户端的请求,那么客户端的并发访问将会变得毫无意义。因此,大部分的web服务器也是支持并发访问的。常见的Java web服务器有Tom.原创 2021-06-19 12:26:15 · 405 阅读 · 0 评论 -
Apache HTTP server benchmarking tool(ab)-服务器基准测试工具一文上手
有经典,有干货,微信搜索【李子捌】关注这个每日更新的程序员。简介ab是一个Apache Http服务器基准测试工具。它可以测试HTTP服务器每秒最多可以处理多少请求。如果测试的是web应用服务,这个结果可以转换成整个应用每秒可以满足多少请求。缺点这是一个非常简单的工具,用途比较有限,只能针对单个URL进行尽可能快的压力测试。Windows下如何下载安装(Linux安装十分简单)Apache HTTP server benchmarking tool(ab)下载地址资源 2.4版.原创 2021-06-19 12:17:50 · 753 阅读 · 0 评论 -
手写线程池实战
有经典,有干货,微信搜索【李子捌】关注这个傻瓜式坚持的程序员。往期回顾-线程池技术详解线程池实战简介:上文讲述了怎么写一个简单的数据库连接池,试想一下,当服务端接收到来自客户端的成白上千个连接请求时,如果每次我们都为其创建一个线程去执行任务,执行完毕后销毁线程,这肯定不是一个好的解决办法。我们知道线程的创建和销毁是要消耗系统资源的,那么我们就可以从这个方面入手来控制资源的浪费。线程池描述:线程池技术是一种池化思想,也就是提前预置若干数量的线程,并且线程不能由用户直接控制,在这个前提下重复.原创 2021-06-18 00:06:15 · 760 阅读 · 6 评论 -
手写数据库连接池实战
1、简单的数据库连接池简介:使用等待超时模式来构造一个简单的数据库连接池。数据库连接池支持如下功能普通获取连接无超时时间超时获取连接,超时时间之后返回null使用连接释放连接记录获取连接和为获取连接的次数,统计连接池的性能超时等待模式在实现数据库连接池功能之前,我们先来回顾一下上一章的等待/通知经典范式。即加锁、条件循环和处理逻辑三个步骤,但是常规的等待/通知无法做到超时等待,因此我们做一些小改动来实现一个超时等待的等待/通知范式。改动方式:定义等待时间T计算超时返回的时间n原创 2021-06-18 00:02:23 · 424 阅读 · 5 评论 -
如何让 a == 1 && a == 2 && a == 3同时成立?
简述看到这个问题是不是觉得很神奇,其实只要利用一点Java的语法特性就能解决问题。1、解决思路:Java专家组发现,Integer对象初始化的大部分数据介于-128127之间,因此Integer对小数据(-128127)预置了缓存,以此来提升大部分情况下实例化一个Integer的性能。其解决办法是,在jvm初始化的时候,数据-128127之间的数字便被缓存到了本地内存中,如果初始化-128127之间的数字,会直接从内存中取出,不需要新建一个对象,而这个数据被缓存在Integer的内部类Int原创 2021-06-16 23:36:39 · 3894 阅读 · 25 评论 -
线程间之间是如何通信的?
有经典,有干货,微信搜索【李子捌】关注这个傻瓜式坚持的程序员。简介:线程开始运行,拥有自己的栈空间,就会如同一个脚本一样,按照既定的代码一步步的执行,直到终止。但是,如果每个线程之间都是孤立的,那么它们的价值就会很少;反之,如果多个线程能够配合着完成工作,将会带来各方面巨大的收益。1、volatile和synchronized关键字说明:(不做过多说明,需要的话可以看我的往期)Java支持多线程访问一个对象或者对象的成员变量,由于每个线程都拥有这个变量的拷贝(为了执行速度更快),所以程序执.原创 2021-06-16 22:27:57 · 1923 阅读 · 6 评论 -
吐血整理-高级程序员必备Java并发编程原理,没时间看建议收藏
简介:Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,这一系列几篇文章将揭开Java内存模型的神秘面纱。这一系列的文章大致分4个部分,分别是:Java内存模型基础,主要介绍内存模型相关基本概念Java内存模型中的顺序一致性,主要介绍重排序与顺序一致性内存模型同步原语,主要介绍三个同步原语(synchronized、volatile和final)的内存语义及重排序规则在处理器中的实现Java内存模型的设计,主要介绍Java内存模型的设计原理,及其与处理器内存模型和顺原创 2021-06-14 23:17:25 · 1411 阅读 · 3 评论 -
Java线程基础
简介:线程是操作系统调度的最小单元,在多核环境中,多个线程能同时执行,如果运用得当,能显著的提升程序的性能。一、线程初步认识1、什么是线程操作系统运行一个程序会为其启动一个进程。例如,启动一个Java程序会创建一个Java进程。现代操作系统调度的最小单元是线程,线程也称为轻量级进程(Light Weight Process),一个进程中可以创建一个到多个线程,线程拥有自己的计数器、堆栈和局部变量等属性,并且能访问共享的内存变量。处理器会通过快速切换这些线程,来执行程序。2、Java本身就是原创 2021-06-14 22:18:14 · 2573 阅读 · 8 评论 -
单例模式你不得不知道的底层原理
简介在Java多线程中,有时候可能需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁(饿汉式单例中经常用)是常见的延迟初始化方案,但它是一个错误的用法。本文将分析双重检查锁定的错误根源,以及两张线程安全的延迟初始化方案。1、双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时,程序员可能会采用延迟初始化。但要争取实现线程安全的延迟化需要一些技巧,以此来避免不必要的问题。非线程安全延迟初始化代码示例:package原创 2021-06-13 01:32:12 · 497 阅读 · 0 评论 -
单例模式双重检查锁定与延迟初始化你不得不知道的底层原理
简介在Java多线程中,有时候可能需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁(饿汉式单例中经常用)是常见的延迟初始化方案,但它是一个错误的用法。本文将分析双重检查锁定的错误根源,以及两张线程安全的延迟初始化方案。1、双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时,程序员可能会采用延迟初始化。但要争取实现线程安全的延迟化需要一些技巧,以此来避免不必要的问题。非线程安全延迟初始化代码示例:package原创 2021-06-13 01:31:19 · 3003 阅读 · 4 评论 -
Java内存模型之happens-before
简介happens-before是JMM的核心概念。理解happens-before是了解JMM的关键。1、设计意图JMM的设计需要考虑两个方面,分别是程序员角度和编译器、处理器角度:程序员角度,希望内存模型易于理解、易于编程。希望是一个强内存模型。编译器和处理器角度,希望减少对它们的束缚,以至于编译器和处理器可以做更多的性能优化。希望是一个弱内存模型。因此JSR-133专家组设计JMM的核心目标就两个:为程序员提供足够强的内存模型对编译器和处理器的限制尽可能少下面通过原创 2021-06-12 21:44:33 · 1412 阅读 · 6 评论 -
Java面试-final的内存语义
上篇介绍了锁和volatile的内存语义,本文讲述的是final的内存语义,相比之下,final域的读和写更像是普通变量的访问。1、final域的重排序规则final对于final域编译器和处理器遵循两个重排序规则在构造函数内对一个final域的写入,与随后把这个对象的引用赋值给另一个引用变量,这两个操作之间不能重排序初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。读起来相对拗口,用代码来说明上面两种重排序规则:package com.li原创 2021-06-11 23:26:44 · 435 阅读 · 1 评论 -
Java面试-锁的内存语义
简介:锁的作用是让临界区互斥执行。本文阐述所得另一个重要知识点——锁的内存语义。1、锁的释放-获取建立的happens-before关系锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。锁释放-获取的示例代码:package com.lizba.p1;/** * <p> * 锁示例代码 * </p> * * @Author: Liziba * @Date: 2021/6/10 2原创 2021-06-11 00:32:35 · 377 阅读 · 4 评论 -
Java面试-volatile的内存语义
1、volatile的特性理解volatile特性的一个好办法是把对volatile变量的单个读/写,看成是使用同一个锁对单个读/写操作做了同步。代码示例:package com.lizba.p1;/** * <p> * volatile示例 * </p> * * @Author: Liziba * @Date: 2021/6/9 21:34 */public class VolatileFeatureExample { /** 使用原创 2021-06-10 00:31:10 · 458 阅读 · 3 评论 -
Java面试-内存模型之顺序一致性
简介:顺序一致性内存模型是一个理论参考模型,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照。1、数据竞争和顺序一致性当程序未正确同步时,就可能存在数据竞争。1.1 Java内存模型规范对数据竞争的定义如下在一个线程中写一个变量在另一个线程中读同一个变量写和读没有通过同步来排序如果一个多线程程序能够正确同步,这个程序将是一个没有数据竞争的程序,往往存在数据竞争的程序,运行结果与我们的预期结果都会存在偏差。1.2 JMM对多线程程序的内存一致性做的保证如原创 2021-06-08 23:28:17 · 494 阅读 · 5 评论 -
面试干掉一大片—Java重排序
简介:重排序是指编译器和处理器为了优化性能而对指令序列进行重新排序的一种手段。1、数据依赖性如果两个操作访问同一个变量,而且这两个操作中有一个操作为写操作,此时这两个操作之间存在数据依赖性。数据依赖性分为三种,如表所示:名称代码示例说明写后读a=1;b=a;写一个变量后,再读这个位置写后写a=1;a=2;写一个变量后,在写这个变量读后写a=b;b=1;读一个变量后,再写这个变量上面的这三种情况,只要重排序了两个操作的执行顺序,程序的执行结果就会被改原创 2021-06-07 23:46:58 · 471 阅读 · 3 评论 -
Java内存模型基础
简介:Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,这一系列几篇文章将揭开Java内存模型的神秘面纱。这一系列的文章大致分4个部分,分别是:Java内存模型基础,主要介绍内存模型相关基本概念Java内存模型中的顺序一致性,主要介绍重排序与顺序一致性内存模型同步原语,主要介绍三个同步原语(synchronized、volatile和final)的内存语义及重排序规则在处理器中的实现Java内存模型的设计,主要介绍Java内存模型的设计原理,及其与处理器内存模型和原创 2021-06-06 23:23:15 · 371 阅读 · 2 评论 -
学习Java并发编程之前你不得不知道的那点事
简介:并发编程的目的是为了让程序运行的更快,但是,并不是启动更多的线程就能让程序最大限度的并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行的更快,会面临非常多的挑战,比如上下文切换的问题、死锁问题,以及受限于硬件和软件的资源限制问题,本篇文章介绍几种并发编程的挑战及解决方案,文章总结至《Java并发编程的艺术》一、上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程执行的时间,因为时间片非常短,所有CPU通原创 2021-06-05 01:19:30 · 401 阅读 · 4 评论 -
MyBatis详细教程入门(从0-1这一步你必须迈出去)
Mybaits1、简介1.1 什么是MybatisMyBatis 是一款优秀的持久层框架;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。1.2 持久化数据持久化持久化就是将程序的数据在持久状态和瞬时状态转化的过程内存:断电即原创 2021-06-03 22:45:23 · 632 阅读 · 5 评论 -
Java并发编程底层实现原理(不了解这个不敢说懂并发)
写在前面Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM中,JVM执行字节码,最终需要转换为汇编指令在CPU上执行,Java中所有的并发机制依赖于JVM的实现和CPU的指定。1、volatile 的应用在并发编程中synchronized和volatile关键字都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改了一个共享变量时,另一个线程能读到这个修改的值,如果volatile关原创 2021-06-03 21:33:36 · 460 阅读 · 3 评论 -
Java注解-一文就懂
Java注解1、概念Annotation(注解)是Java提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。Annotation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的Annotation对象,然后通过该Annotation对象来获取注解中的元数据信息。// 定义一个简单测试注解@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @inter原创 2021-06-03 21:29:53 · 346 阅读 · 1 评论 -
Java反射-你不得不知道的那点事
Java反射1、动态语言动态语言是指程序在运行时可以改变其结构,新的函数可以引进,已有的函数可以删除等结构上的变化。比如常见的JavaScript就是动态语言,除此之外Ruby、Python也属于动态语言,而c、c++则不属于动态语言。从反射的角度来说Java属于半动态语言。2、反射机制概念运行状态中知道类的所有方法和属性。在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有你的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取类信息,以及动态调原创 2021-06-02 23:08:21 · 306 阅读 · 3 评论 -
Java集合之ArrayList详解,大厂越来越注重基础了,建议收藏
1、集合1.1 JAVA集合关系图1.2 ArrayList源码分析1、简介ArrayList 是 java 集合框架中比较常用的数据结构了。继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。2、重要属性默认初始容量 10/** * Default initial cap原创 2021-06-02 23:06:15 · 504 阅读 · 2 评论 -
Java集合中的基本数据结构
1、集合中三大数据结构1.1 数组内存地址连续可以通过下标的成员访问,下标访问的性能高增删操作有较大的性能消耗(需要动态扩容)1.2 链表(双向链表)灵活的空间要求,存储空间不要求连续不支持下标访问,支持顺序遍历搜索针对增删操作找到对应的节点改变链表的头尾指针指向即可,无需移动元数据存储位置1.3 树(Java中二叉树特性)某节点的左子树节点仅包含小于该节点的值某节点的右子树节点仅包含大于该节点的值节点必须是二叉树顺序排列存在问题:树可以认为是介于数组和链表原创 2021-06-02 23:01:00 · 437 阅读 · 3 评论 -
Java之IO/NIO五种模型必须了解的基础概念
Java IO/NIO阻塞IO模型最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后,内核回去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核就会将数据拷贝到用户线程,并且返回结果给用户线程,用户线程才能解除block状态。典型的阻塞IO模型如下:// 如果数据没有就绪,就会一直阻塞在read方法data=socket.read();非阻塞IO模型当用户线程发起一个read操作后,并不需要原创 2021-06-02 22:57:33 · 263 阅读 · 0 评论 -
HashMap详解
摘要散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。HashMap是Java程序员使用最频繁的的用于键值对(key value)数据处理的容器,在JDK1.7(Java Developmet Kit)时HashMap采取的是数组+链表的形式存储数据,JDK1.8对HashMap进行了存储结构上的优化,引入了红黑树数.原创 2021-06-02 22:55:02 · 21608 阅读 · 25 评论 -
手把手教你全面掌握-类加载机制(二)
一、双亲委派机制的介绍与分析JVM在加载类时,默认采用的是双亲委派机制,通俗讲,就是某个特定的类的类加载器在接收到加载类的请求时,首先将加载任务委托给父类加载器,依次递归(本质上是loadClass函数的递归调用),因此所有的请求最终都会传送到顶层的启动类加载器中。如果父类加载器可以完成这个加载请求,就成功返回;如果父类加载器无法完成加载请求,子类才会尝试自己加载。事实上,大多数情况下,越基础的类由上层加载器加载,因为这些类往往被用户代码经常调用(当然也存在基础类回调用户代码的情况,即破坏双亲委派机制的情原创 2021-06-02 22:43:41 · 262 阅读 · 0 评论 -
手把手教你全面掌握-类加载机制(二)
摘要:**Java开发人员经常会在程序中遇到java.lang.ClassNotFoundException这个异常,而这个异常背后涉及的Java知识点就是我们今天要讲的主题,Java的类加载机制。 **一、加载的五大过程JVM类加载机制分为五个部分:加载、验证、准备、解析、初始化。下面我们就从这五个方面来看一下JVM是怎么进行类加载的。1、加载加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。注意这里不一原创 2021-06-02 22:43:07 · 330 阅读 · 2 评论 -
Unsafe-Java永远的“神”(二)
我们平时如何实现浅克隆?实现Closeable接口重写close()方法一、Unsafe实现浅克隆浅克隆工具类package com.liziba.unsafe.clone;import com.liziba.unsafe.UnsafeFactory;import sun.misc.Unsafe;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.util.Arrays;/*原创 2021-06-02 22:40:37 · 439 阅读 · 0 评论