自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 JVM-类加载

我们面试的时候,经常会被问到类加载机制,要想把这个问题很好的回答,需要对类加载体系非常熟悉,希望看了这里的介绍,会对大家有一定的帮助。同样还是建议大家先阅读下《Java字节码解读》,再来看类加载。我们先用一张图来描述下类的整个生命同期:加载加载是类加载过程的第一步,这个加载过程主要就是靠类加载器实现的,包括用户自定义的类加载器。加载过程我们都知道类由类加载器加载,在加载的过程中JVM主要做3件事情:通过一个类的全限定名来获取定义此类的二进制字节流(class文件)在程序运行过程中,当

2021-08-28 13:40:16 187

原创 JVM-JIT

JDK、JRE与JVM的关系我们一直学习怎么使用Java,像我工作了好几年,也不知道这三者的关系,不知道也没关系,把自己不知道的让自己变成知道那就是进步,不要对自己有太高的期望,大家都是平常人。下图很好的解释了这三者之间的关系:JDK包含了编译器等开发工具和JRE,而JRE包含了运行类库和JVM。那JVM又是个啥?JVM和Java的关系讲道理Java是一门语言,跟JVM关系不大,我们的Java代码经过编译后成为class文件,JVM加载的就是这些class文件,JVM并不是只能加载由Java编译的

2021-08-24 20:16:29 422

原创 Centos安装Redis

1)下载源码https://download.redis.io/releases/从上面的地址中选择要下载的版本[root@redis01 tools]# wget https://download.redis.io/releases/redis-6.2.4.tar.gz--2021-06-28 14:46:05-- https://download.redis.io/releases/redis-6.2.4.tar.gzResolving download.redis.io (download

2021-08-21 01:25:34 206

原创 动态代理实现原理

动态代理由来Java程序员应该都知道,静态代理就是使用一个代理类(Proxy)来完成想要完成的事情,Proxy类通过编译器编译成class文件,当系统运行时,此class已经存在。这种静态的代理模式在增强现有的接口业务功能方面有很大的优点,但是大量使用静态代理,会使系统内的类大规模爆发,不易维护。为了解决这个问题,就有了动态创建Proxy的想法,在运行状态中,动态的创建一个Proxy代理类,使用完之后就会销毁,这样就不用维护大量的代理类。静态代理案例创建一个车票接口,定义一个卖票的方法。packa

2021-08-19 10:07:16 300

原创 DNS、CDN知识

DNS在了解DNS之前,我们先来了解下域名。我们在访问网站的时候,都是通过域名来进行访问的,那么域名是怎么找到我们访问的网站的呢?其实域名是被一个叫做ICANN的组织进行管理的,我们常见的域名结尾部分,如.com、.cn、.net、.org…等。类似这种就叫做顶级域名,由于顶级域名非常的多,ICANN不好管理这么多的顶级域名,于是每个顶级域名都找一个托管商,让托管商来管理。而ICANN则管理这些托管商,ICANN也被称为根域名节点。所有域名查询都要先查询根域名,只有根域名才知道这些顶级域名都是由谁在管

2021-08-18 11:53:47 147

原创 HTTP、HTTPS总结

HTTP(Hyper Text Transfer Protocol)名叫超文本传输协议。早期HTTP只有GET请求,用来简单的拿文件,拿完就断开了连接。HTTP1.0时期,在单一GET方式中增加了POST、HEAD命令、引入了请求头和响应头、增加了HTTP版本号、增加了响应状态码、引入Content-Type使传输不限于文本。但是该版本还是存在一些问题:连接无法复用,HTTP1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接。发送一次请求时,需要等待服务端响

2021-08-17 16:22:43 105

原创 OSI模型和TCP三次握手四次挥手

我们通过电脑进行上网,需要借助网线、光纤、路由器等设备,我们先来简单了解下这几种设备是怎么传送网络信号的,在计算机系统中,只能够识别0或1的二进制数据。网线普通的网线由四组铜导线组成,一共8根。通过在网线的两端加上电压,然后改变电压的值,这样就可以使用低压表示0,高压来表示1,以此来传递0、1电信号。光纤光纤中含有玻璃纤维,可以对光进行折射,从而可以将光从一端传送到另一端。通过控制光的打开和关闭来表示0或1,以此来传递光信号。无线设备我们常见的无线路由器,通过改变电压从而产生变化

2021-08-16 16:12:25 136

原创 Centos安装Mysql的三种方式

以下都是在Centos7环境下安装Mysql5.7,环境不同可能会不出一些不一样的问题,所以大家尽量使用和本文一样的环境,Centos7环境可以参考VM安装Centos7的文档。一、yum安装https://repo.mysql.com/中找到自己要下载的版本,这里以5.7为例[root@mysql01 tools]# wget https://repo.mysql.com/mysql57-community-release-el7.rpm1)安装mysql源[root@mysql01 tool

2021-08-15 14:28:41 7778 5

原创 VMware安装Centos7.9及基本配置

下载Centos操作系统,地址:https://www.centos.org/download/启动虚拟机网卡配置[root@mother-board ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33#修改BOOTPROTO="static",最后添加下面的IP配置,具体IP根据自己的IP段进行配置。IPADDR=192.168.31.100GATEWAY=192.168.31

2021-08-13 15:45:53 745

原创 volatile原理

volatile我们都知道volatile可以解决线程间变量可见性问题。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。使用hsdis工具打印出汇编指令,可以发现,加了volatile修饰之后打印出来的汇编指令多了下面一行:lock是一种控制指令,在多处理器环境下,lock汇编指令可以基于总线锁或者缓存锁的机制来达到可见性的效果。CPU处理器在了解volatile之前,我们需要先了解下线程的相关知识。线程是CPU调度的最小单元,线程设计的目的是为了更充分的发挥CPU

2021-08-12 19:38:01 354

原创 ReentrantLock源码解析

Java除了使用关键字synchronized,还可以用ReentrantLock实现独占锁的功能。ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,更多区别还需要大家自己去理解,只有充分了解了ReentrantLock和synchronized才会明白两者的区别所在,这里就不一一说明有哪些区别了,每个人的理解都不一样,死记硬背的逻辑不可靠。ReentrantLock分为公平锁和非公平锁,用法如下:package com.doaredo.test;import

2021-08-11 20:17:07 76

原创 浮点类型精度问题

在Java中,浮点类型有float、double两种类型,主要用于表示小数。我们经常看到浮点数有精度问题,不适用于比较大小或比较相等的逻辑。任何数字在计算机中都是用0和1的二进制形式来表示的,那么对于浮点数又是如何使用0和1表示出来的呢?浮点数二进制计算方法对于整数的二进制计算,采用“除2取余,逆序排列”来算出二进制,如下所示:对于小数的二进制计算,采用“乘2取整,顺序排列”来算出二进制,如下所示:浮点数二进制转10进制要使用二进制表示浮点数,就是要让小数部分也能使用二进制来表示。二进

2021-08-10 23:10:25 762

原创 ThreadLocal源码分析

ThreadLocal称为线程本地变量,可以让每个线程拥有一个属于自己的变量的副本,主要作用就是做数据隔离,在多线程环境下,每个线程可以拥有自己的变量数据,不被其他线程可见。使用场景Spring事务隔离级别在Spring事务环节讲解参数传递在项目中经常会有一个线程调用多个方法的情况,方法间需要传递对象,比如用户信息、业务信息等。如果给每个方法都增加参数会比较麻烦,像第三方的库,对象参数就传递不过去了。我们可以使用ThreadLocal在调用前把参数set进来,其它需要的地方get下就可以了

2021-08-10 23:07:48 87

原创 CAS原理

CAS即Compare And Swap,我们称为比较再交换。在Java中,并发情况下,我们可以使用synchronized来实现锁。在jdk1.5之前,synchronized为悲观锁,后面由于ReentrantLock的无锁操作,synchronized也进行了改版,性能反而比ReentrantLock的好一点,但核心原理和ReentrantLock相关无几,其中都有使用CAS算法。CAS是用在多线程环境下,要真正理解CAS,我们还需要了解一点关于CPU的知识:线程是CPU调度的最小单元,线程设计的

2021-08-10 20:35:45 204

原创 HashMap(jdk1.8)源码思想

HashMap实现于Map接口,元素以键值对的方式存储,允许使用null键和null值,不能保证元素的顺序,是线程不安全的。HashMap-HashtableHashtable的方法都有synchronized修饰,是线程安全的HashMap可以使用null作为key,而Hashtable不允许这里重点说一下hashtable不允许null的情况,在HashMap中,key为null的时候做了特殊处理,hash的时候直接返回0,也就是key为null时在数组的第1个位置。而Hashtable直接

2021-08-09 11:29:54 142

原创 ArrayList源码及应用

ArrayList是一种List实现,它的内部用一个动态数组来存储元素,因此ArrayList能够在添加元素的时候进行动态的扩容。数组我们知道ArrayList查找效率高,这个都是基于数组来实现的,那么数组为什么查找效率高呢?Java的数组中存储的每个元素类型一致,每个元素占用的空间大小相同。Java数组中存储的每个元素,内存地址是连续的。通常首元素的内存地址作为整个数组对象的内存地址。数组中的元素是有下标的,有下标就可以计算出被查找的元素和首元素的偏移量。实际上数组中查找元素是可以通过计

2021-08-08 22:47:32 179

原创 四张图看懂线程池

线程池程序的运行,本质上是对系统资源(CPU、内存、磁盘、网络等)的使用。如何高效的使用这些资源,是编程优化演进的一个方向。线程池就是一种对CPU利用的优化手段。池化技术池化技术就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,以此来提升性能。在编程领域,一些常用的池化技术有(线程池、连接池、内存池、对象池等)。带着问题看线程池线程池的线程是如何做到复用的?当线程小于核心线程数时,队列中的取数据使用take方法,该方法中使用了线程的awa

2021-08-05 20:46:27 509

原创 Java线程的底层原理

线程线程是CPU独立调度的单位,通过引入线程,实现时分复用,利用并发思想使我们的程序运行的更加迅速。线程与语言无关,由操作系统来实现,主要有3种实现方式:用户级线程内核级线程用户级线程+内核级线程内核线程内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换。用户线程一个线程只要不是内核线程,就可以认为是用户线程。Java线程Java线程是映射到操作系统的内核线程上的。要启动一个Java线程,主要有两种方式:继承Thread实现Runnablepacka

2021-08-02 22:07:31 895

原创 Java环境安装

JDK安装要编写Java代码,第一件事情就是安装JDK,只有安装了JDK我们才可以运行​Java代码。jdk官网下载一时搞不定的,可以直接到百度网盘下载。链接: https://pan.baidu.com/s/1j6z79hxuwUhiWSA897Wncg 提取码: y9i2官网下载JDK,百度搜索JDK进入oracle官网进入网站后,往下找到Java Archive这里有各版本JDK的下载地址,我们后面都使用8这个版本,这也是现在常用的版本。找到对应系统版本的JDK,点击后面的下载链接。

2021-07-31 02:35:22 145

原创 学Java的疑惑

学Java的疑惑1)零基础能够学Java吗?零基础是最好学Java的,所有的学习都要有一个空杯心态,往往懂一点的人都不具备空杯心态,导致学习比较困难,总以为自己都懂。而零基础的正好相反,什么都不懂,反而可以学得更好。总之,无论何时,保持空杯心态,慢慢来,就会有收获。2)不会英文能学Java吗?首先,编程跟英文没关系。你看到的那些编程代码跟英文没有一点关系。只要你认识键盘上面有的字符,你就可以学。3)现在学Java来得及吗?目前,大部分公司都有自己的软件,而且越来越多,虽然程序员也很多,但是对于互

2021-07-31 02:24:49 165

原创 Java字节码解读

Java字节码文章目录Java字节码示例代码查看字节码字节码结构魔数版本号常量池访问标志类索引、父类索引、接口索引字段表方法表属性表Java号称“一次编译到处运行”,但是我们对这句话理解深度有多少呢?我们写的Java文件通过编译器编译成class文件,Java虚拟机执行的就是class文件。不论class文件来自哪里,由哪种编译器编译,或者是手写的class文件,只要符合Java虚拟机规范,那么它就能被虚拟机执行。示例代码package com.doaredo.test;public clas

2021-03-19 13:26:44 267

空空如也

空空如也

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

TA关注的人

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