
深入谈谈Java
对java相关知识以及问题进行陈述和记录。注:供学习用,侵权删!
BoCong-Deng
翻过这座山,别人就能听到你的故事!
展开
-
HikariCP连接池各属性详解
HikariCP是由日本程序员开源的一个数据库连接池组件,代码非常轻量,并且速度非常的快。根据官方提供的数据,在i7,开启32个线程32个连接的情况下,进行随机数据库读写操作,HikariCP的速度是现在常用的C3P0数据库连接池的数百倍。在SpringBoot2.0中,官方默认也是使用的HikariCP作为数据库连接池,可见HikariCP连接池的目的就是为了极致的数据库连接性能体验。HikariCP优化机制相对于其他的数据库连接池,有着以下的优势原创 2020-06-22 17:47:50 · 4579 阅读 · 0 评论 -
彻底理解AbstractQueuedSynchronizer(二)
在分析 Java 并发包 java.util.concurrent 源码的时候,少不了需要了解 AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是 Java 并发包的基础工具类,是实现 ReentrantLock、CountDownLatch、Semaphore、FutureTask 等类的基础。原创 2020-04-16 20:15:52 · 375 阅读 · 0 评论 -
彻底理解AbstractQueuedSynchronizer(一)
在分析 Java 并发包 java.util.concurrent 源码的时候,少不了需要了解 AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是 Java 并发包的基础工具类,是实现 ReentrantLock、CountDownLatch、Semaphore、FutureTask 等类的基础。在分析 Java 并发包 java.util.concurrent 源码的时候,少不了需要了解 AbstractQueuedSynchronizer(以下简写AQS)这个抽象原创 2020-04-13 18:54:34 · 312 阅读 · 0 评论 -
单纯为了实用,创建线程的几种方法
原始的创建线程的方法有三种,分别是:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口。当然还可以利用Future和FutureTask来获取返回值。原创 2020-04-12 20:20:34 · 357 阅读 · 0 评论 -
ReentrantLock你了解多少(结合Lock、AQS进行讲解)
本篇文章要讲的是`Lock` 接口,重点强调 `ReentrantLock` 类,相关的接口在JUC 包里面,自 JDK 5 起,Java 类库中新提供了 `java.util.concurrent` 包(通常简称为 JUC 包)。Java 中有两种对并发资源加锁的方式,除了 `synchronized` 之外(不清楚的可以查看我之前写过的一篇关于synchronize文章),还有本篇原创 2020-04-12 19:39:19 · 3372 阅读 · 0 评论 -
看完这篇恍然大悟,理解Java中的偏向锁,轻量级锁,重量级锁
锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)原创 2020-04-11 16:54:42 · 11886 阅读 · 7 评论 -
你会算对象的大小么?不会的话就看看这篇文章吧
使用面向对象语言,离不开的就是对象,现在回过头来思考一下,真的了解所使用语言的对象么?我自己有点心虚,对于Java的对象,我了解的尚且还不够深入,对于一些底层的东西,还有待进一步了解学习。这一篇博文,来讲讲Java对象的大小,学习如何计算Java对象的大小。如果你想深入Java 对象的内存设计,以及在做内存优化时,需要知道每个对象占用的内存的大小,所以这一点还是很重要的,需要好好理解。要计算Java对象占用内存的大小,首先需要了解Java对象在内存中的实际存储方式和存储格式。原创 2020-04-10 18:49:31 · 6871 阅读 · 0 评论 -
聊一聊分支预测,思考为什么使用 if/else 语句会降低程序效率
在Stack Overflow上看到了这样的一个帖子,觉得挺值得学习的,这个帖子是关于讨论为什么处理排序数组比处理未排序数组快?看完后面的回答,然后得到了一个概念,就是“分支预测”,然后针对分支预测查看了许多资料和论文,觉得收获挺多的,所以写一篇博文记录一下。原创 2020-04-07 17:58:59 · 12213 阅读 · 0 评论 -
看完这篇,有人问你synchronized 关键字就不要怂
Java 原生的有两种实现锁的机制,一种是通过底层实现的 synchronized 关键字,另一种是 Doug Lea 在 JDK1.5 实现的 java.util.concurrent 包中的 Lock 类。这两种方法一种是 Java 关键字,另一种是用对象的方式,两种都实现了并发状态下对公共资源的加锁。原创 2020-04-04 12:07:17 · 3536 阅读 · 0 评论 -
Java的几种时间类,你了解多少?
我们使用Java的时候,经常会用到的一个类就是时间类,但是很多时候我们只是匆匆而过,并没有深入去了解时间类。在我开发历程中,碰到了许多有关时间类的问题,所以今天抽空,把Java的时间类阐述总结一下,希望看完这篇的小伙伴能有所收获。本篇文章分四个部分讲,分别是 `Java 基础时间类`、`Java sql 时间类`、`Joda Time 时间类`、 `java.time 时间类`。原创 2020-04-02 23:56:58 · 8390 阅读 · 2 评论 -
打印Java数组你不知道的几种方式
在 Java 中,数组虽然是一个对象,但并未明确的定义这样一个类,因此也就没有覆盖 toString() 方法的机会。如果尝试直接打印数组的话,输出的结果并不是我们预期的结果。那有没有一些简单可行的方式呢?这个问题看起来挺简单的,打印数组谁不会呀,但是请你仔细想一下,你能够通过多少种方式打印,且哪种方式最优雅简洁呢?原创 2020-03-31 16:23:34 · 10769 阅读 · 0 评论 -
玩转位运算的N条实践小技巧
对于位运算我们应该不陌生(当然,如果你还很陌生,你可以看我之前写过的关于位运算的文章,挺详细的),这一篇主要是针对平时我们日常生活中,碰到的关于位运算的一些问题,而总结出来的一些实践技巧,能够帮助我们快速解决一下相关问题,有助于玩转位运算的操作。本文会不断更新,日后碰到很多奇思妙想会继续更新进来,也欢迎大家留言更新。原创 2020-03-29 23:53:26 · 509 阅读 · 0 评论 -
这一篇足够让你理解深拷贝和浅拷贝(详细)
任何变成语言中,其实都有浅拷贝和深拷贝的概念,Java 中也不例外。在对一个现有的对象进行拷贝操作的时候,是有浅拷贝和深拷贝之分的,他们在实际使用中,区别很大,如果对其进行混淆,可能会引发一些难以排查的问题。Java 中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、用作方法参数或返回值时,会有值传递和引用(地址)传递的差别。原创 2020-03-29 18:18:44 · 10188 阅读 · 0 评论 -
好好聊一聊Java中的正则表达式
正则表达式,又称规则表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。通常都是用来验证输入的字符串数据是否复合正则表达式定义的规范,常被用来做验证操作。原创 2020-03-23 10:31:12 · 745 阅读 · 1 评论 -
Optional是个好东西,你会用么?(全面深度解析)
写在前面从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException)这个异常就不多说了,肯定是每个 Java 程序员都非常了解的异常。Optional 的完整路径是 java.util.Optional,使用它是为了避免代码中的 if (obj != null) { } 这样范式的代码,可以...原创 2020-03-20 11:29:45 · 30571 阅读 · 8 评论 -
浅谈JVM中的OopMap
目录•写在前面•保守式GC•准确式GC•补充•半保守式GC•JNI方法•写在前面JVM在进行正式GC之前总是需要进行可达性分析来查找内存中所有存活对象,以便能够正确的回收已经死亡的对象,如果有了解JVM的GC机制的话(不了解可以看一下我的另一篇文章,JVM如何判断对象能否回收),我们就会知道,调用栈里的引用类型数据时GC的根集合的重要组成部分,找出栈上的引用是GC的...原创 2020-01-09 16:04:24 · 13310 阅读 · 0 评论 -
了解并发编程中对象的共享
目录•写在前面•可见性volatile变量•发布与逸出•线程封闭Ad-hoc线程栈封闭ThreadLocal类•不变性•安全发布•写在前面我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且希望确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。如果没有同步,那么这种情况就无法实现,所以我们可以通过显示的同步或者类库...原创 2019-12-30 11:59:56 · 11069 阅读 · 1 评论 -
理解什么是线程安全性、原子性
目录•写在前面•原子性加锁机制•写在前面进程想要执行任务需要依赖线程,换句话说就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。提到多线程这里要说两个概念,就是串行和并行,搞清楚这个我们才能更好的理解多线程。所谓串行其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子,我们下载多个文件,在串行中它是按照一定的顺序去进行下载的,也就是说必须等下载完A...原创 2019-12-29 11:56:30 · 12492 阅读 · 0 评论 -
由JVM深入了解Java的线程安全与锁优化
目录•写在前面•线程安全Java语言中的线程安全线程安全的实现方法•锁优化自旋锁与自适应自旋锁消除锁粗化轻量级锁偏向锁•写在前面讲道理,在谈及线程安全以及锁优化之前,需要先搞清楚啥是线程,像那些硬概念这里我就不多说,什么线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源,又可以独立调度(...原创 2019-12-25 15:12:17 · 11201 阅读 · 0 评论 -
深入理解Java内存模型(JMM和volatile关键词)
目录•写在前面•物理机三级缓存•乱序执行优化•Java内存模型•内存间交互操作•volatile型变量•先行发生原则•写在前面在正式讲解之前呢,我们先来讨论讨论硬件的效率与一致性。这里我们讲讲物理机对并发的处理方案,因为物理机遇到的并发问题与虚拟机中的情况有不少相似之处,所以它的方案对于虚拟机的实现也有相当大的参考意义。如何让计算机并发执行若干个运算任务以及如何...原创 2019-12-25 11:35:22 · 11168 阅读 · 0 评论 -
彻底搞清楚Java的位运算(位实现加减乘除)
目录•写在前面•机器数和机器数的真值•原码、反码和补码的基础概念和计算方法原码反码补码•java中的运算符•不用乘除算乘除加法减法乘法除法•写在前面二进制位运算是最贴近计算机真实运算操作,通过位运算,我们可以高效的完成各种基础运算(加减乘除取余等),我们还可以使用位运算巧妙的完成原本很复杂的工作,真正理解计算机,我们才能更好的使用计算机。在这...原创 2019-12-23 20:27:19 · 16800 阅读 · 6 评论 -
Java虚拟机类加载机制-双亲委派模型
目录•写在前面•类加载的时机•类加载的过程加载验证准备解析初始化•类加载器•写在前面其实类加载机制并不是很神秘,可以说我们无时无刻不在是由类加载,只是很多时候我们不需要关注类加载机制会给我们带来啥影响,不过如果你深入了解类加载机制的原理,你就会发现,原来我们日常代码是这样运行的,甚至对代码编写的各类继承、本地库方法、网络间方法,来点以前没敢尝试过的骚操作...原创 2019-12-20 20:09:19 · 11088 阅读 · 0 评论 -
通俗易懂且详细的了解Class类文件结构
目录•写在前面•无符号数和表•魔数和Class文件的版本•常量池•访问标志•类索引、父类索引与接口索引集合•字段表集合•方法表集合•写在前面提到java,我们可能第一时间想起的就是那句口号,“一次编写,到处运行”,这体现了java与平台无关的优势,而实现这种特性的的基础,是通过将java编译成字节码文件,虚拟机可以载入和执行同一种平台无关的字节码,从而实现这...原创 2019-12-19 19:37:31 · 12355 阅读 · 0 评论 -
JDK的命令行工具、故障处理分析工具
目录•写在前面•jps虚拟机进程状况工具•jstat虚拟机统计信息监视工具•jinfo配置信息工具•jmap内存映像工具•jhat虚拟机堆转储快照分析工具•jstack堆栈跟踪器•JConsole 监视与管理控制台•VisualVM多合一故障处理工具•写在前面我们平时使用java时,基本都是将下载下来的JDK包用来当基础环境用,一般程序运行包括测试监控都...原创 2019-12-18 23:44:30 · 12446 阅读 · 1 评论 -
JVM的GC回收算法、GC收集器以及内存分配策略
目录•写在前面•标记-清除算法•复制算法•标记-整理算法•HotSpot上的算法实现保障•GC收集器•内存分配策略•写在前面JVM的垃圾回收算法、收集器以及内存分配策略放在一起了解和理解,我觉得有助于我们加深印象,这一篇文章我就不再讲述对象为什么要回收以及何时回收了,想要了解相关知识可以看我的另一篇文章JVM如何判断对象是否要回收。几个点放在一起内容会有些多,不...原创 2019-12-17 11:18:40 · 11089 阅读 · 5 评论 -
JVM如何判断对象能否被回收
目录•写在前面•对象的创建•引用计数算法•可达性分析算法•引用•不可达必须“死”?•最后•写在前面说起Java和C++,很容易想到让人疯狂的指针,Java使用了内存动态分配和垃圾回收技术,让我们从C++的各种指针问题中摆脱出来,更加专心于业务逻辑,不过如果我们需要深入了解java的JVM相关原理,我们必须要面对这些东西,深入了解JVM在内存动态分配和垃圾回收技术...原创 2019-12-16 16:11:57 · 12748 阅读 · 5 评论 -
由浅入深的分析HashMap原理
目录•写在前面•HashMap简介•Hash函数•初始容量和负载因子•通过put和get看底层结构•高并发下的HashMap•写在前面对于大多数人HashMap是一个熟悉又陌生的的类,我们经常在需要使用键值对的地方使用HashMap,但是要你说上HashMap相关实现细节,估计就支支吾吾了,这里我对HashMap进行由浅入深的分析,文章涉及到的HashMap底层源码...原创 2019-12-13 19:45:27 · 10580 阅读 · 0 评论 -
Java虚拟机运行时数据区
目录•写在前面•程序计数器•java虚拟机栈和本地方法栈•java堆•方法区•写在前面Java虚拟机运行时数据区是我们深入了解JVM的必经之路,那这是什么样的一个区域呢?Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分若干个不同的数据区域,这些区域被赋予不同的用途,它们有着各自创建和销毁时间,有的区域是随着虚拟机进程启动而存在的,有的区域则是依赖用户线程...原创 2019-12-13 14:55:00 · 10835 阅读 · 0 评论