![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 96
weixin_43766753
个人博客 : https://qwerhuan.gitee.io 热爱编程,热爱android,欢迎交流
展开
-
深入浅出Java线程池:源码篇
前言在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用。(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适)。本文则深入线程池的源码,主要是介绍ThreadPoolExecutor内部的源码是如何实现的,对ThreadPoolExecutor有一个更加清晰的认识。ThreadPoolExecutor的源码相对而言比较好理解,没有特别难以读懂的地方。相信没有阅读源码习惯的读者,跟着本文,也可以很轻松地读懂ThreadPoolExecutor的核心源码逻辑。原创 2021-02-06 01:59:46 · 307 阅读 · 0 评论 -
深入浅出Java线程池:使用篇
前言很高兴遇见你~借助于很多强大的框架,现在我们已经很少直接去管理线程,框架的内部都会为我们自动维护一个线程池。例如我们使用最多的okHttp以及他的封装框架Retrofit,线程封装框架RxJava和kotlin协程等等。为了更好地使用这些框架,则必须了解他的实现原理,而了解他的原理,线程池是永远绕不开的话题。线程的创建与切换的成本是比较昂贵的。JVM的线程实现使用的是轻量级进程,也就是一个线程对应一个cpu核心。因此在创建与切换线程时,则会涉及到系统调用,是开销比较大的过程。为了解决这个问题,线程原创 2021-01-31 17:43:48 · 227 阅读 · 0 评论 -
Java之String重点解析
String s = new String("abc")这段代码创建了几个对象呢?s=="abc"这个判断的结果是什么?s.substring(0,2).intern()=="ab"这个的结果是什么呢?s.charAt(index) 真的能表示出所有对应的字符吗?"abc"+"gbn"+s直接的字符串拼接是否真的比使用StringBuilder的性能低?前言很高兴遇见你~Java中的String对象特性,与c/c++语言是很不同的,重点在于其不可变性。那么为了服务字符串不可变性的设计,则衍..原创 2020-12-19 16:33:42 · 236 阅读 · 2 评论 -
HashMap相关类:Hashtable、LinkHashMap、TreeMap
前言很高兴遇见你~在 深入剖析HashMap 文章中我从散列表的角度解析了HashMap,在 深入解析ConcurrentHashMap:感受并发编程智慧 解析了ConcurrentHashMap的底层实现原理。本文是HashMap系列文章的第三篇,主要内容是讲解与HashMap相关的集合类。HashMap本身功能已经相对完善,但在某些特殊的情景下,他就显得无能为力,如高并发、需要记住key插入顺序、给key排序等。实现这些功能往往需要付出一定的代价,在没有必然的需求情景下,增添这些功能是没必要的。因原创 2020-12-10 12:16:39 · 273 阅读 · 0 评论 -
深入解析ConcurrentHashMap:感受并发编程智慧
如果有一个整型变量count,多个线程并发让count自增1,你会怎么设计?你知道如何让多个线程协作完成一件事件吗?前言很高兴遇见你~ConcurrentHashMap是个老生常谈的集合类了,我们都知道多线程环境下不能直接使用HashMap,而需要使用ConcurrentHashMap,但有没有了解过ConcurrentHashMap到底是如何实现线程安全的呢?他到底跟传统的Hashtable和SynchronizeMap(没听过SynchronizeMap?他就是Collections.s..原创 2020-12-08 17:32:45 · 772 阅读 · 2 评论 -
深入剖析HashMap
前言很高兴遇见你~HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点。本文并不打算讲解基础的使用api,而是深入HashMap的底层,讲解关于HashMap的重点知识。需要读者对散列表和HashMap有一定的认识。HashMap本质上是一个散列表,那么就离不开散列表的三大问题:散列函数、哈希冲突、扩容方案;同时作为一个数据结构,必须考虑多线程并发访问的问题,也就是线程安全。这四大重点则为学习HashMap的重点,也是HashMap设计的重点。HashMap属于Map集合体系的原创 2020-12-05 23:21:49 · 207 阅读 · 0 评论 -
一文搞懂 | Java中volatile关键字
前言很高兴遇见你~volatile关键字在Java多线程编程编程中起的作用是很大的,合理使用可以减少很多的线程安全问题。但其实可以发现使用这个关键字的开发者其实很少,包括我自己。遇到同步问题,首先想到的一定是加锁,也就是synchronize关键字,暴力锁解决一切多线程疑难杂症。但,锁的代价是很高的。线程阻塞、系统线程调度这些问题,都会造成很严重的性能影响。如果在一些合适的场景,使用volatile,既保证了线程安全,又极大地提高了性能。那为啥放着好用的volatile不用,偏偏要加锁呢?一个很重要的原创 2020-11-13 20:14:32 · 282 阅读 · 0 评论 -
JVM基础(三):垃圾回收机制
前言很高兴遇见你~ 欢迎阅读我的文章。Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来垃圾收集(Garbage Collection ,也称为GC),是虚拟机中一个永恒不变的话题。上述那句话堪称经典,同时也点出了垃圾回收这个问题的重要性。在c/c++中,开发者对内存有至高无上的权利,同时也需要自己对对象负责到底:创建和释放,每一块内存使用完之后都需要调用free方法来释放内存。而JVM采用自动化技术,开发者无需关心内存的分配以及释放,当一个对原创 2020-10-25 12:20:09 · 575 阅读 · 0 评论 -
JVM基础(二):运行时数据区
前言很高兴遇见你~ 欢迎阅读我的文章。在上一篇文章JVM基础(一):认识虚拟机中,介绍了什么是虚拟机,以及字节码class文件。这一篇文章主要讲关于JVM的运行时数据区结构。我们知道,c/c++在内存上划分为了栈和堆区,栈区存放函数的局部变量等,堆区为用户自主开辟的空间。当开发者需要新建一个对象时,首先需要在堆区中开辟一个空间,再初始化,使用。最后需要自己手动去释放该内存区域。而JVM把这些工作都做好了,当我们需要新建一个对象的时候,只需要一个关键字new即可创建一个对象,当我们不再使用这个对象的时候原创 2020-10-21 19:41:48 · 298 阅读 · 0 评论 -
JVM基础(一):认识虚拟机
前言很高兴遇见你~ 欢迎阅读我的文章。JVM是每个Java程序员必须迈过去的一个坎,因为它实在是太重要了。Java的底层知识,归根结底,都是JVM相关知识。很多读者看到jvm就感觉:哦这是底层知识,算了先学好应用层再说。或者到了面试需要不得不背诵几道题。在我看来,了解JVM是理解整个Java生态的必经之路。编程语言的发展,从机器码01串到现在的高级Java语言,这里面凝结了无数先驱的智慧。了解JVM,不只是为了面试,更是为了感受前人的智慧,学习JVM也可以让我们的Java程序更加地健壮。而关于非JVM原创 2020-10-21 13:55:59 · 421 阅读 · 1 评论 -
静态工厂代替多参构造器
静态工厂代替多参构造器背景假如现在你要想一个汉堡,有一个汉堡类:Hamburg。那么一般情况下你会:Hamburg hamburg = new Hamburg();情景一:不同参数数目的构造器制作汉堡可以选择自定义,加肉,加菜,或者不添加,直接默认配方即可,那么会有以下几个构造器:Hamburg();Hamburg(Meat meat);Hamburg(Meat meat,Vegetable vegetable);当你要制作汉堡的时候,看到这么多的构造器,但是却不知道他们是什么意思,返原创 2020-10-12 19:01:50 · 175 阅读 · 2 评论 -
关于Java受检异常的思考
受检异常是否真的有必要?这是一个争论了很久的问题,至今仍然没有一个确定的答案。Java的受检异常,被很多人吐槽,也被很多人喜爱,当然他们都可以拿出很多的理由来证明自己的观点。看过《洞穴奇案》这本书的读者,可以了解到,从不同的角度、不同的利益诉求来看同一个问题可以得到不同的答案。没有谁对谁错,只有理解的不同。对于这个问题,我也就我自己的个人感受来简单谈一谈个人观点,而答案,相信读者心中早就有了。什么是异常?要了解受检异常,首先要了解什么是异常。在Java中,异常是一套能够一致地处理错误和恢复代码运行正原创 2020-10-02 23:23:49 · 421 阅读 · 0 评论