自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ConcurrentHashMap源码及实现原理详解

ConcurrentHashMapHashMap虽然好用,但是它却不是线程安全的,而在并发度较高的现在,在有些情况下它可能就不是那么合适了,所以需要一个线程安全键值对结构。Hashtable是线程安全的,但是它却过于笨重了,相比于HashMap而言,它仿佛只是在HashMap的每一个方法上加了一个synchronized,效率可想而知。所以就有了我们今天这篇问文章的主角ConcurrentHashMap,毕竟讲HashMap不讲ConcurrentHashMap那就是耍流氓,想要了解HashMap的同学

2021-01-31 17:34:09 344 3

原创 JVM垃圾收集器概述及其简单调优

JVM垃圾收集器概述及其简单调优Serial收集器最适用于应用程序的内存小于100MB的情况。如果应用程序没有使用机器上的所有CPU,那么Concurrent收集器能取得更好的性能。堆空间小于4GB的时候,CMS收集器性能比G1收集器要好,因为CMS使用的算法比G1更简单。而在大型堆或者巨型堆的时候,由于G1收集器可以分割工作,通常他比CMS收集器表现更好。调整堆大小如果分配的堆比较小,程序大部分时间可能消耗在GC上,没有足够的时间取运行应用程序逻辑。但如果堆分配的过大,虽然GC的频率会变得更少,

2021-02-21 23:12:16 239 6

原创 HashMap源码及其常见问题详解

HashMap其实我一直想写一下HashMap的源码分析,在我看来,它的源码真是经典中的经典,从其中可以学到很多,而HashMap本身也是使用的比较多的一个数据结构,它是学习Java集合的过程中绕不过的一步。简介即使你没有看过HashMap的源码你也应该听说过**HashMap的底层结构是数组+链表+红黑树**,当然这是Java8中的结构,HashMap相比于Java7在Java8中做出了较大的改动,本文我们只讨论Java8中的源码,对Java7感兴趣的同学可以自行查阅相关源码。好的,言归正传,我们

2021-01-27 17:15:38 230 2

原创 ReentrantLock与读写锁

ReentrantLock与读写锁在上一期我们介绍完Java中锁的基础AQS之后,没看过的可以去看一下 从源码分析队列同步器(AQS),这一期我们来讲解一下在AQS的基础上ReentrantLock的源码实现,看一看Java是如何实现锁的可重入和公平锁与非公平锁的实现。简介我们先了解ReentrantLock内部是一个什么样的结构,在ReentrantLock里有一个Sync的内部类,这个类继承了AQS,并且Sync有两个子类,分别是FairSync和NonfairSync,这也是ReentrantL

2021-01-26 20:13:31 500

原创 从源码分析队列同步器(AQS)

AQS从这篇开始我们就要开始学习java中的各种锁,但是俗话说的好万丈高楼平地起,要想学习锁的实现原理就要先打好地基,学好基础,所以我们先从java最底层的东西——队列同步器AbstractQueuedSynchronizer(简称AQS)。有些人可能不知道AQS是一个什么东西,但你们一定知道Lock接口,实现Lock接口的基础就是AQS,简单来说AQS是用来构建锁和同步组件的基础框架,他在内部定义了一个int类型的volatile变量state来表示同步状态。获取到同步状态就代表着获取到锁,并且在底层

2020-12-24 14:21:48 116

原创 揭开Java线程的神秘面纱

线程什么是线程首先要聊线程我们得先知道什么是线程,线程是操作系统调度的最小单位,它被包含进程之中,是进程中的实际运作单位,一个进程里可以创建多个线程,这些线程都拥有自己属性,并且能够访问共享的内存变量。在单处理器的情况下,CPU会在这些线程上高速切换,让用户感觉有好多个线程在同时运行,但其实同一个时间点只有一个线程在运行,这就是并发。而在多处理器的情况下,每一个CPU都会有一个线程在运行,所以在同一时间点上真正有多个线程在运行,这是并行。并行与串行并行一定比串行快吗?不一定,因为线程有创建和上下

2020-12-08 20:07:24 90

原创 聊一聊Java内存模型(JMM)

Java内存模型(JMM)java之间线程的通信是由JMM控制的,JMM决定了一个线程对共享变量的修改何时对另一个线程可见。在JMM中,线程之间共享一个主内存,而每个线程又有自己的本地内存,每次本地内存更改后都要刷新到主内存,这样其他线程才可见。本地内存是JMM中的一个虚拟概念,并不真实存在。重排序重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。在进行重排序时会遵守数据依赖性,不能改变存在数据依赖关系的两个操作的执行顺序。数据依赖性:一个数据的读或写依赖于另一个数据的

2020-11-19 17:33:21 87

原创 浅谈方法区,永久代与元空间

浅谈方法区,永久代与元空间在我学习JVM运行时数据区的时候就有一个疑惑,永久代与元空间到底是啥?它们到底在哪?JVM规定的运行时数据区域只有五块,也没有永久代和元空间啊,对于这个问题我打算彻底搞懂他。(注:本文均是Hotspot虚拟机实现方式)JVM载入类的时候,需要存储类的元数据(即已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据),存储这些数据的区域就叫做方法区。方法区是JVM的一个规范,而永久代和元空间是对其具体的实现,在JDK7中是永久代,在JDK8中是元空间。不过永久

2020-07-27 17:18:33 163

原创 带你彻底搞懂锁膨胀,偏向锁,轻量级锁,重量级锁

1.synchronized我们都知道synchronized内部有四种状态,分别是:无锁、偏向锁、轻量级锁和重量级锁,所以要搞懂这几种锁之间的变化我们得对synchronized有个大致的了解。首先说一下synchronized在底层的实现,他是基于进入和退出Monitor对象(每一个对象都会有一个monitor与之关联)来实现方法同步和代码块同步的,对于方法同步官方并没有具体指出是如何实现...

2020-04-24 14:57:30 1436 1

原创 什么?这样做得到的结果竟然是。。。由虚拟机栈来搞懂i++与++i

1.java虚拟机栈简单介绍一下,在JVM中的运行时数据区分为五大区域,分别是程序计数器、java虚拟机栈、本地方法栈、堆和方法区。而今天我们主要讲的就是java虚拟机栈。这一块区域是线程私有的,也就是每一个线程就是一个栈,在这个栈里存放的元素就是栈帧,这个栈帧说白了就是方法,每一个栈帧的入栈出栈就是一次方法的执行。在栈帧里主要有局部变量表,操作数栈,动态链接和方法出口。了解这个东西离不开...

2020-04-21 16:10:35 200 1

原创 深入理解JVM学习笔记(三)

一、OutOfMemoryError1.Java堆溢出  Java堆用于存储对象实例,只要不断地实例对象,并避免GC将他们回收,那么在对象达到最大堆容量的时候就会产生内存溢出错误。这里介绍几个关于关于堆的参数: -Xms:堆的最小值 -Xmx:堆的最大值 -Xmn:新生代的大小 -XX:+HeapDumpOnOutOfMemoryError:让虚拟机在出现内训溢出错误的时候D...

2019-08-17 17:21:54 140 1

原创 Hash与HashCode

1.hash和hash表首先看一张来自百度百科的解释  hash是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值,hash表就是所有的hash值组成的,有很多种hash函数,也就代表着有很多种算法得到hash值。2.hashCode  hashcode就是通过hash函数得来的,通俗的说,就是通过某一种算法得到的,hashcode就是在hash表中有对应...

2019-08-13 20:37:55 1012

原创 深入理解JVM学习笔记(二)

二、垃圾收集器1.概述  在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,顾名思义,垃圾回收就是释放垃圾占用的空间,这一切都交给了JVM来处理。  在探讨Java垃圾回收机制之前,我们首先应该记住一个单词:Stop-the-World。Stop-the-world意味着 JVM由于要执行GC而停止了应用程序的执行,并且这种情形会在任何一种GC算法中发生。当Stop-the-w...

2019-07-22 17:00:16 116

原创 深入理解JVM学习笔记(一)

一、java内存区域1. 运行时数据区域1.1 程序计数器  程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。程序计数器是线程私有的,每个线程都有一个独立的程序计数器,各条线程之间的计数器...

2019-07-11 13:53:25 182

空空如也

空空如也

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

TA关注的人

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