自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 聊一聊FutureTask源码中体现的“自旋锁”思想

自旋锁是什么?在代码中如何使用?这篇文章以JDK源码中的一个实际案例来演示自旋锁

2025-02-14 23:16:03 709

原创 线程池ThreadPoolExecutor的源码中是如何解决自身的并发问题的?

要读懂线程池ThreadPoolExecutor的源码,首先要理解其内部使用到的线程安全机制

2023-01-01 18:21:30 2496

原创 用Java语言实现文本内容对比的算法和程序

前言近日,鄙人在工作中接到甲方提出的一项研发需求,就是用程序将修改后的文件内容和修改前的文件内容进行比对,找出其中差异的部分进行展示,以便能够一眼看出修改人对文件做出了哪些修改。刚接到这项需求时,感到颇有难度,但是我相信世界上没有无算法可以解决的问题,也没有程序实现不了的功能。经过深入思考,终于想出来实现文本内容对比的算法,并且写成程序得以实现。现将编程思想、算法和代码公布,欢迎各位软件研发人...

2019-11-10 21:41:35 10812 16

原创 聊一聊Netty中的执行器选择策略

Netty中的执行器选择策略很简单,使用一个每次递增的计数器,然后每次执行next()选取执行器时,将计数器的值和执行器的数量进行取模。根据执行器的数量是不是2的幂,决定使用快速取模法和普通取模法。不过笔者对这个DefaultEventExecutorChooserFactory代码有点疑问,在PowerOfTwoEventExecutorChooser 选择器中,其计数器使用的是AtomicInteger类型;

2025-02-18 18:28:50 980

原创 Netty源码解析之服务端启动过程(二):绑定端口

接着上文《Netty源码解析之服务端启动过程(一):服务端channel的形成和注册》,Netty服务端启动过程的服务端channel部分注册完成后,还剩下进行端口绑定的doBind0方法。提示:绑定端口的源码涉及Netty的事件传播机制的原理,没办法一并写出来。如果读者不知道Netty的事件传播机制会有一些地方不明所以,这点我觉得没关系,先把绑定端口的基本脉络搞清楚,以后看完事件传播机制后,再回头看这段源码,就会都清楚了。笔者认为,读一些难度比较高的框架源码,首先一定要学会“

2025-02-18 16:12:19 600

原创 Netty源码解析之服务端启动过程(一):服务端channel的形成和注册

本篇文章从源码角度详细跟踪了Netty服务端的启动过程

2025-02-17 18:57:59 1170 4

原创 Netty源码解析之异步处理(二):盛赞Promise中的集合设计

在阅读Netty源码的过程中,我越来越相信一句话:“Netty的源码非常好,质量极高,是Java中质量最高的开源项目之一”。如果认真研究,会有一种遍地黄金的感觉。本篇文件我将记录一下鄙人在Promise的实现类DefaultPromise中发现的一块黄金:即用来存储监听器的集合的设计。

2025-02-14 17:47:25 966

原创 Netty源码解析之异步处理(一):Promise系列的源码与实现原理

Promise相对而言比较抽象,先来一段示例代码,请读者体会Netty中的Promise如何使用。这段代码的含义为:1、有个执行器eventExecutor 需要使用一个名为A计划的任务的执行结果,但是自己不能去执行A计划,因此其自己有个名为B计划的任务要执行。2、将B计划交给了名为“worker”的线程去异步执行。3、因为执行器eventExecutor 要忙于其他工作(执行B计划),所以不能通过阻塞的方式来等待worker线程执行完成。4、于是使用了promise,在promise上添加了监听

2025-02-14 15:01:23 986

原创 Java中toArray方法怎么使用最快?

笔者在阅读Netty的工具类FastThreadLocal的源码时,自觉得其中的一行代码写的不对,于是在GitHub上提交了修改。结果有点悲剧,就是被老外大哥怼了一下😔😔😔。

2025-02-13 11:13:45 294

原创 Netty源码解析之ThreadLocal的改进和优化(二):对FastThreadLocal中源码的质疑与思考

FastThreadLocal作为Netty对ThreadLocal的改进版,其设计和源码自然相当优秀。然而鄙人在读完以后,觉得其中有些源码的细节值得推敲。特此写个博客,希望广大热爱研究源码的同仁前来阅读和给予指点。本次先写其中一点,即ThreadLocal中的数组扩容方式。其实鄙人对ThreadLocal源码的质疑不止如此,以后继续补充。

2025-02-13 09:42:44 776

原创 Netty源码解析之ThreadLocal的改进和优化(一):FastThreadLocal的源码和实现原理

接上文《Netty源码解析之线程池的实现(二):创建线程与执行任务》,我们知道NioEventLoopGroup在执行任务时,会调用ThreadPerTaskExecutor的execute方法。ThreadPerTaskExecutor中含有一个线程工厂threadFactory,在其execute方法中,会使用线程工厂threadFactory创建一个新线程。这个threadFactory在NioEventLoopGroup的构造方法中创建,为DefaultThreadFactory实例。

2025-02-12 13:03:55 1254

原创 Netty源码解析之线程池的实现(二):创建线程与执行任务

/创建NioEventLoopGroupSystem.out.println(Thread.currentThread()+"准备执行任务");//执行任务i < 3;i++){@OverrideSystem.out.println(Thread.currentThread()+"执行任务");});

2025-02-06 16:26:07 882

原创 Netty源码解析之线程池的实现(一):EventLoopGroup和EventLoop

Netty中的线程池实现方式和JDK完成不同。Netty中的线程池准确的说可以叫做执行器组,即EventLoopGroup,执行器组EventLoopGroup里面包含若干个执行器EventLoop。这种包含关系,以我们惯常的编码方式来实现的话,肯定是在EventLoopGroup中使用一个集合属性(如栈、链表等)来存储EventLoop。

2025-02-05 21:17:04 1064

原创 volatile变量需要减少读取次数吗

Netty这段的注释给出了增加先使用局部变量handlerState 来保存volatile修饰的成员变量handlerState这行代码的理由:Store in local variable to reduce volatile reads。在编程中,减少对易变(volatile)变量的读取次数可以是一种优化技术,尤其是在并发编程中。测试结果显示两种方式耗时差不多!对于这样的结果,是我的验证方式不准确,还是Netty源码中的先将volatile变量存入本地局部变量的做法是冗余代码,欢迎大家批评指正。

2025-02-03 22:16:23 494

原创 AQS源码与实现原理

ReentrantLock和synchronized一样是一种可重入锁,但是其相比synchronized而言增加了一些高级功能,分别是以下3点:1、等待可中断如果当前持有锁的线程长期不释放,正在等待的线程可以放弃等待,改为处理其他事情。2、公平锁多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁;而非公平锁则不保证这一点,在锁被释放时,任何一个等待锁的线程都有机会获得锁。synchronized的锁是非公平的,ReentrantLocak在默认情况下是

2023-10-20 16:26:56 244

原创 ConcurrentHashMap源码阅读笔记:initTable()方法

ConcurrentHashMap的initTable()方法源码分析,解析每一行代码的作用

2023-01-07 20:03:55 945 2

原创 从FutureTask源码看CAS思想的应用

这个网上很多资料,大家自己百度吧。

2022-11-08 14:11:08 648 2

原创 关于Java虚拟机的各类问题探讨

写在前面鄙人之前读过周志明先生的《深入理解Java虚拟机》一书,虽然感觉受益匪浅,但是感觉读完以后对JVM仍然有很多疑问,在书中也找不到合适的答案,特此开一个博文,把我遇到的问题写出来,希望各路大神前来指点迷津。对JVM的问题1、Java8之后,静态变量存储在哪?《深入理解Java虚拟机》的第46页写道“JDK1.7时HopSpot虚拟机已经讲原本放在永久代中的字符串常量池、静态变量移出,到JDK1.8时完全摒弃了永久代的概念”。但是对静态变量从永久代中移出之后,在JDK1.7和JDK1.8中分别存

2022-04-09 16:55:34 1025

原创 ThreadLocal源码与实现原理

写在前面最近在研究JUC下面的并发工具类的源码,看了ThreadLocal的源码与实现原理,虽然我在网上也看到很多了ThreadLocal解析的文章,但是总感觉讲的太浅或者有些讲的不对,就自己写了一篇。笔者水平有限,文中如有疏漏欢迎各位读者批评指正。ThreadLocal的作用ThreadLocal是一种用线程本地存储来实现线程安全的方式,它的作用是将线程共享的变量在每个线程本地存储一份副本,每一个线程都可以独立地改变和获取自己的副本,而不会和其它线程的副本冲突。每一个ThreadLocal对象都能创

2022-04-06 02:12:28 1151 3

原创 HashMap源码和实现原理

HashMap简介HashMap是一种利用哈希表原理存储元素的集合,当遇到哈希冲突时,HashMap会使用链地址法来解决冲突。在JDK1.7中,HashMap是由数组+链表构成的,在JDK1.8中则采用了数组+链表+红黑树的结构,新增了红黑树作为底层数据结构使得查询效率变得更高。HashMap理论基础一、HashMap数据结构HashMap使用数组、链表和红黑树三者结合起来存储数据,构成一个哈希表。哈希表中每一个节点为HashMap集合存储的一个键值对,节点里面包含当前节点的哈希值、key、valu

2021-08-20 14:23:28 1443

原创 深度解析红黑树

前言红黑树是计算机科学中最难理解的数据结构之一,本文将带大家从认识红黑树的前世今生开始,探寻红黑树的结构和原理。二叉查找树二叉查找树的定义二叉查找树是一种特殊的二叉树,其改善了二叉树结点查找的效率,二叉查找树具有以下性质:对于任意一个节点n:1、其左子树下的每个后代节点的值都小于节点n的值。2、其右子树下的每个后代节点的值都大于节点n的值。3、左右子树也均为二叉查找树。所谓节点 n 的子树,可以将其看作是以节点 n 为根节点的树。子树的所有节点都是节点 n 的后代,而子树的根则是节点 n

2021-08-01 18:30:25 2330 7

原创 LinkedList源码与实现原理

LinkedList源码与原理在我们平常用LinkedList时,我们肯定都知道LinkedList的一些特点,比如a、LinkedList是通过链表实现的。b、如果在频繁的插入,或者删除数据时,就用linkedList性能会更好。c、linkedList是一个非线程安全的(异步),其中在操作Interator时,如果改变列表结构(add\delete等),会发生fail-fast(快速失败行为)。至于LinkedList内部是怎样的一种结构,为什么具有这些特点,请看LinkedList的源码实现

2021-02-01 19:04:30 288 1

原创 ArrayList源码与实现原理

ArrayList简介 在初学Java时就会学习ArrayList、LinkedList这两种JDK中常见的集合类,其中ArrayList本质上是一种动态数组,具有良好的随机访问的性能,即在集合中查找元素的性能比较高,但是其进行元素的插入和删除效率却偏低;而LinkedList则是一种双向链表,其随机访问元素的性能较差,但是对其进行插入和删除元素的效率却比ArrayList高。 以上都是初学Java时需要掌握的基础知识,如果需要知道为什么ArrayList、LinkedList具有这些区别,

2021-01-23 15:42:41 6891 11

原创 一个很有趣的算法题:任意数分三组,使得每组之和尽量相等

前言 鄙人近日看到一个算法题,觉得非常有趣,题目为:任意一些数字分为三组,使得每组之和尽量相等。题目看似简单,但是要设计出能够经得住不限数量、不限顺序的任意一些数字的测试的算法并且写成代码实现,并不那么容易。 鄙人这两天想了多种方法解决这个问题。 第一种是将任意数字分成3组的所有可能的组合全部求出存入集合,然后遍历集合找出和差距最小的3组的组合。这种方法不仅编码麻烦,程序的计算...

2019-08-23 23:29:09 10101 17

原创 用java语言编写程序计算九宫图

前言对于程序员来说,用程序解决数学问题是最有趣的事情之一。本人研究了一个能够轻易计算九宫图的算法,并且用java语言编写程序得以实现。现将算法和代码公布,欢迎广大程序爱好者前来阅读、交流。九宫图简介九宫图是我国古老的数学问题,也是一种数字艺术,就是把1~9九个数字填到3行3列九个方格中,使其每一横、坚、斜行之和都等于15。如下图就是九宫图:编程思想要计算九宫图,我首先想到的是找数字规律...

2018-11-18 10:27:20 3543 1

原创 用java程序破解迷宫问题

前言 日前,有位同仁向我介绍了迷宫问题,激发了我强烈的兴趣与研究欲望。经过深入思考,终于找到了破解迷宫问题的算法,并且用java语言编写程序得以实现,现将算法和代码公布,欢迎广大程序爱好者前来阅读,如有改善意见也希望能相互交流。 本文的算法和程序均为本人原创,如要转载请标明出处,谢谢!迷宫问题简介 给一个有指定行数和列数的迷宫,迷宫内的方格由通道和墙壁组成,某人在迷宫内...

2018-10-27 01:25:53 950

空空如也

空空如也

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

TA关注的人

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