自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

阳阳的博客

热爱技术,享受生活

原创 【HashMap】为什么长度总是2的整数次方

前言 开门见山,HashMap这样做有两点原因 提升计算效率,更快算出元素的位置 减少哈希碰撞,使得元素分布均匀 提升计算效率 我们先看put方法的细节: public V put(K key, V value) { return putVal(hash(key...

2020-05-25 18:00:40 303 0

原创 【多线程】LongAdder实现原理
原力计划

前言 AtomicInteger、AtomicLong使用非阻塞的CAS算法原子性地更新某一个变量,比synchronized这些阻塞算法拥有更好的性能,但是在高并发情况下,大量线程同时去更新一个变量,由于同一时间只有一个线程能够成功,绝大部分的线程在尝试更新失败后,会通过自旋的方式再次进行尝试...

2020-05-24 00:42:17 554 0

原创 【多线程】说说线程池
原力计划

前言 线程池内部是多个线程的集合,在创建初期,线程池会创建出多个空闲的线程,当有一个任务需要执行时,线程池会选择出一个线程去执行它,执行结束后,该线程不会被销毁,而是可以继续复用。 使用线程池可以大大减少线程频繁创建与销毁的开销,降低了系统资源的消耗。当任务来临时,直接复用之前的线程,而不是先...

2020-05-21 11:03:06 513 0

原创 【多线程】Semaphore实现原理
原力计划

前言 Semaphore,信号量,一般用于控制同时访问资源的线程数量。可以认为Synchronized代表的是一把锁,那么Semaphore就是多把锁。 常用方法 public class Semaphore implements java.io.Serializable { //...

2020-05-20 13:51:53 149 0

原创 【多线程】CyclicBarrier实现原理
原力计划

前言 CyclicBarrier,字面意思“循环屏障”,用于多个线程一起到达屏障点后,多个线程再一起接着运行的情况。例如,线程1和线程2一起运行,线程1运行到屏障点a时,将会被阻塞,等到线程2运行到屏障点a后,线程1和线程2才可以打破屏障,接着运行。如果有屏障点b,则他们需要像打破屏障a一样打破...

2020-05-19 11:39:29 246 0

转载 一步一步推导出 Mysql 索引的底层数据结构

Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql 数据的存储形式以及索引的设计,决定了 Mysql 整体的数据检索性能。 我们知道,索引的作用是做数据的快速检索,而快速检索的实现的本质是数据结构。通过不同数据结构的选择,实现各种数据快速检...

2020-05-18 09:48:33 80 0

转载 面试官:请写一个你认为比较“完美”的单例

转自半路雨歌,原文地址面试官:请写一个你认为比较“完美”的单例 单例模式是保证一个类的实例有且只有一个,在需要控制资源(如数据库连接池),或资源共享(如有状态的工具类)的场景中比较适用。如果让我们写一个单例实现,估计绝大部分人都觉得自己没问题,但如果需要实现一个比较完美的单例,可能并没有你想象中...

2020-05-15 15:08:55 127 0

原创 【多线程】CountDownLatch实现原理

前言 CountDownLatch是多线程中一个比较重要的概念,它可以使得一个或多个线程等待其他线程执行完毕之后再执行。它内部有一个计数器和一个阻塞队列,每当一个线程调用countDown()方法后,计数器的值减少1。当计数器的值不为0时,调用await()方法的线程将会被加入到阻塞队列,一直阻...

2020-05-15 14:52:56 447 0

原创 【多线程】浅探CAS实现原理

前言 CAS,全称是Compare And Swap,即比较并交换,是一种乐观锁的实现。 悲观锁与乐观锁 悲观锁 总是假设最坏的情况,线程a每次去获取或更新数据的时候,都会觉得别的线程也正在修改这个数据,为了避免自己的更新操作丢失,线程a会尝试获取此数据的锁,线程a获取到之后,才能对此数据...

2020-05-14 17:40:39 241 0

原创 【JVM】对象的内存布局,怎样确定对象的大小
原力计划

一个对象在内存中究竟是怎样进行布局的,如何依据代码去确定对象占据的大小,本文将进行粗略地探讨。 对象在内存中的布局,主要有3个组成部分,包括对象头,实例数据与对齐填充。确定对象的大小,也是从这3个组成部分的入手。 对象头 其中对象头中又包括Mark Word与Klass Word。当该对象是...

2020-05-12 18:22:55 1228 0

原创 【JVM】class文件结构3——字段表与方法表

1、魔数 我们可以利用editplus,以16进制的编码格式来查看class文件的结构,具体操作方法为在editplus的工具栏中点击Edit,下拉选择Hex Viewer即可。 如图所示,前四(4个bit位*8个字母=32,32/8=4字节)个字节为0xCAFEBABE,这就是class...

2020-05-11 16:35:42 552 0

原创 【JVM】class文件结构2——类索引、超类索引与接口表索引

1、类索引 类索引紧随在类访问标记之后,占两个字节,里面存储一个指向常量池的一个索引,用于指出该class文件的全限定名。 以下面这个简单的java类为例: package com.yang.testFlag; public class Main { } 其16进制数据: 可以...

2020-05-11 16:33:57 500 0

原创 【JVM】class文件结构1——魔数、版本号、常量池与类访问标记

1、魔数 我们可以利用editplus,以16进制的编码格式来查看class文件的结构,具体操作方法为在editplus的工具栏中点击Edit,下拉选择Hex Viewer即可。 如图所示,前四(4个bit位*8个字母=32,32/8=4字节)个字节为0xCAFEBABE,这就是class...

2020-05-11 16:28:50 530 0

转载 【Mysql】回表与覆盖索引是神魔鬼?

select id,name where name='shenjian' select id,name,sex* where name='shenjian'* 多查询了一个属性,为何检索过程完全不同? 什么是回表查询? 什么是索引覆盖? 如何实现索...

2020-04-30 11:19:20 402 0

原创 【JVM】类加载器与双亲委派模型
原力计划

类加载器在加载阶段,会将class文件加载进方法区。有关类加载的全过程,可以先参考我的另外一篇文章类的奇幻漂流——类加载机制探秘 类加载器的类型 类加载器有以下种类: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) ...

2020-04-29 11:21:11 841 0

原创 【JVM】虚拟机栈的五脏六腑
原力计划

虚拟机栈,本身就是一个普通的栈,栈中的元素叫做栈帧。 虚拟机栈是线程私有的,每有一个线程,虚拟机就会创建一个虚拟机栈,线程与虚拟机栈一一对应。线程每调用一个方法,虚拟机就会创建一个栈帧,并将此栈帧压入虚拟机栈中,当方法调用结束后,此栈帧又从虚拟机栈中弹出。 线程每调用一个方法,都会起一个栈帧,...

2020-04-27 21:39:55 1160 0

原创 【JVM】类的奇幻漂流——类加载机制探秘
原力计划

1. 装载 我觉得这里使用装载更好一点,第一,可以避免与类加载过程中的“加载”混淆,第二,装载体现的就是一个“装”字,仅仅是把货物从一个地方搬到另外一个地方而已,而这里的加载,却包含搬运货物、处理货物等一系列流程。 装载阶段,将.class字节码文件的二进制数据读入内存中,然后将这些数据翻译成...

2020-04-24 16:56:53 914 0

转载 深入分析AQS实现原理

简单解释一下J.U.C,是JDK中提供的并发工具包,java.util.concurrent。里面提供了很多并发编程中很常用的实用工具类,比如atomic原子操作、比如lock同步锁、fork/join等。 从Lock作为切入点 我想以lock作为切入点来讲解AQS,毕竟同步锁是解决线程安全...

2020-04-23 14:15:43 133 0

原创 JUC基石——Unsafe类
原力计划

前言 我们经常在JUC包下的ConcurrentHashMap、Atomic开头的原子操作类、AQS以及LockSupport里面看到Unsafe类的身影,这个Unsafe类究竟是干什么的,本文可以带着读者一探究竟。 Java和C++、C语言的一个重要区别,就是Java中我们无法直接操作一块...

2020-04-22 14:19:19 538 0

原创 【JVM】灵性一问——为什么用元空间替换永久代?

前言 首先需要明确的是,以下我们讨论的HotSpot虚拟机,其他类型的虚拟机,例如JRockit与J9等,压根就没有永久代的概念。因此,下面所说的“虚拟机”都是HotSpot版本的。 要想理解这种变化的原因,需要先理解方法区、永久代与元空间的概念与之间的关系。 方法区与永久代,元空间之间的关...

2020-04-20 16:44:12 1001 0

原创 将职业和兴趣结合起来,于是“胖了么”诞生了!
原力计划

写在前面的话 博客断断续续写了2年多,毕业也快一年了。从一开始的几个粉丝到现在的6千多粉丝,真的是让我受宠若惊,接下来我会努力提升博客的质量,尽量输出更加优质的内容,有不足的地方还需大家批评指正。 第一次租房 毕业的一年里,发现自己真的是一个吃货,周末在家总是折磨厨房,努力满足自己的胃。说实...

2020-04-19 00:24:25 3310 9

原创 【JAVA】Spring事务的传播行为
原力计划

一、前言 Spring为我们提供了巨大的便利,其中的事务增强特性,使得程序出错时,不需要我们进行手动回滚。Spring在Propagation定义了7种事务的传播行为: public enum Propagation { REQUIRED(TransactionDefinition.PR...

2020-04-17 15:08:51 1855 0

原创 【JVM】说说java中的堆区

堆(Heap)是被虚拟机所管理的最大的一块内存区域,在堆中,会有以下一些对象: 朝生夕死的小对象,蜉蝣一般 大对象,例如长数组,需要大量连续的内存空间 长周期对象,存活很久,很能熬 因此,目前主流的JVM,利用可达性分析算法分析对象是否死亡,最后针对性地采用分代搜集算法回收死亡对象。判断对象...

2020-04-15 11:33:34 520 0

原创 【多线程】Synchronized的优化

对synchronized不太了解的同学,可以先参考我的另外一篇文章【多线程】浅说Synchronized 早期版本synchronized性能较低的原因 在早期版本中,synchronized是一种重量级锁,其底层由Monitor实现,而Monitor又依赖于操作系统的Mutex Lock。...

2020-04-13 16:34:09 606 0

原创 【多线程】浅说Synchronized

一、前言 synchronized关键字用来保证在同一时刻只有一个线程可以执行被它修饰的变量或者代码块。 这一篇中,只涉及synchronized的底层实现原理,不涉及对synchronized效率以及如何优化的讨论。 二、使用方式 (1)给静态方法加锁 public class Ma...

2020-04-13 14:07:12 319 0

原创 【JAVA】初探switch实现原理

日常编码中,我们常常用到switch语句,在我的另外一篇文章中【JAVA】优化if else的几种方式,也谈到了可以利用switch来优化if-else结构,那么switch底层究竟是如何实现的呢? 我们先写几个示例 第一个示例:case条件中的int值连续 public int ...

2020-04-09 14:50:09 329 0

原创 【数据库】浅析Innodb的聚集索引与非聚集索引

Mysql存储引擎之一的Innodb的索引,可以分为聚集索引与非聚集索引,这两种索引都是使用B+树组织的。 本文不讲解什么是索引,对索引不了解的同学可以先移步到我的另外一篇文章【数据库】mysql索引简谈 在分析这两种索引之前,我们先建立一个Person表: CREATE TABLE pe...

2020-04-08 17:14:33 290 0

转载 【数据库】MySQL 加锁处理分析

一、背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思...

2020-04-07 15:28:30 299 2

转载 【数据库】mysql死锁问题分析

线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”。 Oh, My God! 是死锁问题。尽管报错不多,对性能目前看来也无太大影响,但还是需要解决,保不齐哪天成为性能瓶颈。 为了更系统的分析问题,本文将从...

2020-04-07 15:09:53 222 0

原创 【JAVA】Lambda执行原理

在我的想法里,Lambda长得很奇怪,虚拟机真的认识这玩意吗?还是说,Lambda经过编译后,脱掉了伪装的衣服,变成了大家熟知的方法? 对Lambda不熟悉的同学,可以先看我的另外两篇文章。 【Java8】对Lambda的理解 【JAVA8】快速理解Consumer、Supplier、Pre...

2020-04-03 10:06:46 735 0

原创 【JAVA】优化if else的几种方式

在代码编写初期,我们写出来的代码,脉络清晰,结构简单。可随着bug或者新需求的出现,状态变得越来越多,只能不停地加else来区分,久而久之,判断的次数越来越多,嵌套的层数也越来越深,变得难以维护。 当我们狠下心来决定改造时,有哪些方法能够优化if else结构呢? 第一种方法:提前return...

2020-04-01 17:05:56 470 0

原创 【JAVA】对泛型擦除的一点思考

一、什么是泛型擦除 泛型(generics)的真正面目,是参数化对象类型。在使用泛型的时候,我们总是把一个具体的对象类型当作一个参数传入。 泛型的作用就是发生在编译时,它提供了安全检查机制。 可是当处于编译时,所有的泛型都会被去掉,即被还原为原始类型,如java.util.ArrayList...

2020-03-31 18:24:54 394 0

原创 【JAVA】谈谈Arrays.asList()

我们在日常的开发中,常常使用到Arrays.asList()这个方法,它能够很轻易地将一个数组转化为一个List。 例如: Integer[] a = new Integer[]{1, 2, 3}; List<Integer> list = Arr...

2020-03-30 11:32:29 242 0

原创 【数据结构】谈谈单链表和双链表

首先谈谈数组和单链表的区别 数组的特点 在内存中连续 利用下标定位元素,因此查找操作的时间复杂度为O(1) 增加与删除元素时,需要进行移动,因此增加与删除操作的时间复杂度为O(n) 数组大小固定,不能直接扩容。如果需要扩容,也是创建一个更大的数组,再将元素复制过去。 链表的特点 在内存...

2020-03-26 17:40:07 249 0

原创 【JAVA】String为什么不可变

一、前言 关于String的介绍,可以先参考我的另外一篇文章【JAVA】String源码浅谈 本篇文章,主要来探讨String的不可变性 二、到底什么是不可变 可以这样理解,一个对象在创建完成后,不能去改变它的状态,不能改变它的成员变量。如果变量包含基本数据类型,那么这个基本数据类型的值不...

2020-03-23 18:11:51 442 0

原创 【K8S】Service再了解

关于Service的概念及其实例,可以参考这篇文章【K8S】Service概念及其实例 一句话概括Service的作用,Service负责将客户端的请求转发到具有特定标签的Pod上。 但是Service和Pod并不是直接相连的,Pod的ip及端口会被保存在Service的EndPoints列表...

2020-03-20 18:26:44 326 0

原创 【JAVA】条件 a == (Integer) 1 && a == (Integer) 2有可能为true吗?

一、废话 先看看这个代码 int a = 1; if (a == (Integer) 1 && a == (Integer) 2) { System.out.println("true&...

2020-03-19 18:27:31 309 0

原创 【Tomcat】Error parsing HTTP request header的解决方案

最近个人的一个项目,总是不定时浮现Error parsing HTTP request header这样的问题,有以下两种具体报错 Invalid character found in the request target. The valid characters are defined i...

2020-03-17 10:28:27 210 0

原创 【SpringBoot】使用不同的策略动态地调用某个接口的实现类

经常遇到这样的一个需求,前端传的实体类型相同,后端需要根据实体类中的某一个字符串,动态地调用某一个类的方法。 在SpringBoot中,我们可以理解成,一个Controller接口对应多个ServiceImpl,使用这种方式,如果后期需要添加一个功能,仅仅创建一个ServiceImpl就可以满足...

2020-03-12 11:17:15 633 0

原创 【K8S】常用命令记录

1、查看所有的namespace kubectl get namespaces 结果会显示出每个namespace的状态,包含两种 Active和Terminating。 在namespace删除过程中,namespace状态被设置成Terminating。 2、查看当前集群下的节点...

2020-03-10 16:23:15 120 0

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