死磕 Java
文章平均质量分 91
『死磕 Java 』是大明哥多年从事一线互联网 Java 开发的学习历程技术汇总,为大明哥倾全力打造的 Java 进阶类教程,旨在为大家提供一个清晰且详细的 Java 教程。
大明哥_
大明哥,一个专注 Java 技术的硬核程序员,「死磕 Java」 创始人。
展开
-
一口气读完 Java 8 ~ Java 21 所有新特性
大家好,我是大明哥,一个专注「」系列创作的硬核程序员。。Java 现在发布的版本很快,每年两个,但是真正会被大规模使用的是 3 年一个的 LTS 版本。在 Java 版本中,一个特性的发布都会经历孵化阶段、预览阶段和正式版本。其中孵化和预览可能会跨越多个 Java 版本。原创 2023-12-26 10:35:32 · 3724 阅读 · 3 评论 -
Netty 入门 — ByteBuf,Netty 数据传输的载体
到这里大明哥相信各位小伙伴对 ByteBuf 应该有了初步的认识,当然这篇文章只是入门篇而已,里面还有很多细节都没有涉及到,但是不要着急,因为后面还有进阶篇,源码篇,一定会将它讲的明明白白的。ByteBuf 是Netty 的数据传输的载体,它是为了解决 JDK NIO 原生 ByteBuffer 的设计缺陷和不易用而重新设计的,它具备如下几个特性:容量可以动态扩容读写索引(readerIndex、writerIndex)分开,读写模式可以随意切换,不需要调用flip()方法支持引用计数。原创 2023-10-24 20:47:35 · 268 阅读 · 0 评论 -
Netty 入门 — 要想掌握 Netty,你必须知道它的这些核心组件
这里对 Netty 服务端整个流程做一个说明,阐述 Netty 服务端的工作流程,这样我们就清楚知道各个组件在 Netty 中扮演的是什么角色。服务端在启动时,绑定本地端口,会初始化两个 EventLoopGroup,一个 BossEventLoopGroup 和 WorkEventLoopGroup ,其中 BossEventLoopGroup 专门负责接受客户端的连接(Accept 事件),WorkEventLoopGroup 专门负责网络读写。原创 2023-10-18 10:21:35 · 159 阅读 · 0 评论 -
如何利用ChannelPipeline在Netty中搭建无懈可击的数据处理流水线?
pipeline 翻译为管道、流水线,在 Netty 这个大工厂中,ChannelPipeline 就像一条流水线,数据流过 ChannelPipeline,被一步一步地加工,最后得到一个成熟的工艺品。在 Netty 中,ChannelPipeline 是 Netty 的核心处理链,用于实现网络时间的动态编排和有序传播。它负责组织和编排各种 ChannelHandler,使他们能够有序地组织在一起,但实际的数据加工还是由 ChannelHandler 处理。最后,大明哥来做一个总结,加深各位小伙伴们的理解。原创 2023-11-08 09:18:29 · 290 阅读 · 0 评论 -
一卷到底,大明哥带你横扫 Netty
上一个死磕 Java 专栏。原创 2023-10-15 22:21:21 · 396 阅读 · 0 评论 -
Netty 入门 — Bootstrap,一切从这里开始
..这个过程是不是非常想一个构造器模式?其实我们真的将其理解为一个构造器,它就是一个构造服务端、客户端的构造器。那我们是不是可以不使用 Bootstrap 来完成服务端和客户端的初始化呢?其实是可以的,只不过非常麻烦,既然 Netty 为我们提供一个这么好用的工厂类我们为什么不用呢?启动器有两个,一个是客户端,一个是服务端,如下:两个类的配置方式大致相同,我们以 ServerBootstrap 为介绍对象。原创 2023-10-23 11:24:16 · 347 阅读 · 0 评论 -
Netty 是如何利用EventLoop实现千万级并发的
EventLoop 是 Netty 实现 Reactor 线程模型的核心处理引擎。Netty 推荐采用主从多线程模型,其中 BossEventLoopGroup 负责 ServerSocketChannel 的 Accept 事件,WorkerEventLoopGroup 负责 SocketChannel 的读写事件。原创 2023-11-09 22:31:23 · 459 阅读 · 0 评论 -
Netty 入门 — 亘古不变的Hello World
为什么很多人都推崇 Java boy 去研究 Netty?Netty 这么高大上,它到底是何方神圣?Netty 是一款异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。为什么要使用 Netty 呢?使用 Java NIO 需要了解很多概念,而且 API 非常繁琐。使用 Java NIO 编程复杂,一不小心就会 Bug 横飞。开发工作量和难度也很大,例如我们要处理断开重连、网络闪断、半包读写、网络拥塞、异常处理,等等异常情况,处理起来难度比较大。原创 2023-10-15 22:22:04 · 311 阅读 · 0 评论 -
网络编程进化史:Netty Channel 的崭新篇章
在 Java NIO 中我们知道,Channel,即通道,是用来传输数据的一条“管道”,它与 Buffer 相辅相成,在 Java NIO 中,我们只能从 Channel 读取数据到 Buffer 中,或者从 Buffer 读取数据到 Channel 中,如下:在 Netty 中同样有一个 Channel,该Channel 是 Netty 的核心概念之一,它是 Netty 网络 IO 操作的抽象,即 Netty 网络通信的主体,由它来负责对端进行网络通信、注册、数据操作等一切 IO 相关的操作。原创 2023-10-25 20:31:58 · 316 阅读 · 1 评论 -
精密数据工匠:探索 Netty ChannelHandler 的奥秘
根据客户端提交的参数类型,自动流转到相对应的 ChannelHandler。这种方式是最优雅的,也是我们使用最多的方式。他的优点明显,1. 业务解耦,2. 不需要维护码表。ChannelHandler 是 Netty 中真正做事的组件,EventLoop 将监听到的 I/O 事件转发后,就由 ChannelHandler 来处理,它也是我们编写 Netty 代码最多的地方。原创 2023-10-31 22:11:13 · 298 阅读 · 1 评论 -
关于 Java NIO 的 Selector 的事儿,这篇文章里面全都有
【死磕 NIO】— ServerSocketChannel 的应用实例,大明哥分析了 ServerSocketChannel 两种模式的缺点阻塞模式:所有阻塞方法都会引起线程的暂停,根本无法应用到业务中来非阻塞模式:CPU 一直在空转,浪费资源所以,如果是我们服务端单独使用 ServerSocketChannel 确实是很麻烦,典型的吃力不讨好。故而我们希望有一个组件能够统一管理我们的 Channel,这个组件就是选择器 Selector。原创 2023-11-14 21:00:36 · 362 阅读 · 0 评论 -
不是我吹牛逼,这绝对是去掉 if...else 最佳的文章
大明哥在这里总结了 7 中方式用来解决 if…else 的问题,我相信里面总有一两种方案是你比较满意的,七种方案各有优劣,各自有各自的使用场景,我们需要在实践中不断领悟,在重构中不断进化,总结出适合自己最佳的重构方案。重构之路,任重而道远,各位其行且珍惜。原创 2023-11-02 22:29:52 · 225 阅读 · 0 评论 -
是时候放弃 Java 序列化了
有些时候我们并不需要将一个对象的所有属性全部序列化,这个时候我们可以使用 transient 关键字来选择不需要序列化的字段。transient** 的作用就是用来标识一个成员变量在序列化应该被忽略。**// 标识为 transient将 age 属性标识为 transient。// 先序列化Person_1 person = new Person_1("王五",32,180F);System.out.println("原对象:" + person);// 再反序列化。原创 2023-11-05 22:59:51 · 219 阅读 · 0 评论 -
【死磕 NIO】— ServerSocketChannel 的应用实例
大家好,我是大明哥,一个专注于【死磕 Java】的程序员。【死磕 Java 】系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码。死磕 Java :https://www.cmsblogs.com/group/1420041599311810560上篇文章大明哥介绍了 SocketChannel 的核心原理及其源码,这篇文章就来介绍如何使用 ServerSocketChannel,分析单独使用 ServerSocketChannel 存在哪些问.原创 2022-05-25 23:27:12 · 939 阅读 · 2 评论 -
【死磕NIO】— 探索 SocketChannel 的核心原理
大家好,我是大明哥,一个专注于【死磕 Java】系列创作的程序员。【死磕 Java 】系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码。死磕 Java :https://www.cmsblogs.com/group/1420041599311810560前两篇文章我们分析了 Channel 及 FileChannel,这篇文章我们探究 SocketChannel的核心原理,毕竟下一个系列就是 **【死磕 Netty】**了。聊聊Socke.原创 2022-03-28 22:38:59 · 2104 阅读 · 2 评论 -
【死磕NIO】— 跨进程文件锁:FileLock
大家好,我是大明哥,一个专注于【死磕 Java】系列创作的程序员。【死磕 Java 】系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码死磕 Java :https://www.cmsblogs.com/group/1420041599311810560上篇文章(【死磕 NIO】— 深入分析Channel和FileChannel)已经详细介绍了 FileChannel的核心原理及相关API,了解了FileChannel是用来读写和映射一个系.原创 2022-03-21 07:48:02 · 1480 阅读 · 1 评论 -
【死磕 NIO】— 深入分析Channel和FileChannel
大家好,我是大明哥,这次我们来看看NIO的第二个组件:Channel。上篇文章[【死磕 NIO】— 深入分析Buffer]介绍了 NIO 中的 Buffer,Buffer 我们可以认为他是装载数据的容器,有了容器,还需要传输数据的通道才能完成数据的传输,这个通道就是今天要介绍的 Channel。Channel 我们可以认为它是本地 I/O 设备、网络 I/O 的通信桥梁,只有搭建了这座桥梁,数据才能被写入 Buffer 。Channel在 NIO 中,Channel 和 Buffer 是相辅相成的原创 2021-12-15 21:36:55 · 2048 阅读 · 0 评论 -
【死磕 NIO】— 深入分析Buffer
大家好,我是大明哥,今天我们来看看 Buffer。上面几篇文章详细介绍了 IO 相关的一些基本概念,如阻塞、非阻塞、同步、异步的区别,Reactor 模式、Proactor 模式。以下是这几篇文章的链接,有兴趣的同学可以阅读下:【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?【死磕 NIO】— Reactor 模式就一定意味着高性能吗?【死磕 NIO】— Proactor模式是什原创 2021-11-17 08:30:00 · 940 阅读 · 1 评论 -
【死磕 NIO】— Proactor模式是什么?很牛逼吗?
大家好,我是大明哥。上篇文章我们分析了高性能 IO模型Reactor模式,了解了什么是Reactor 模式以及它的三种常见的模式,这篇文章,大明再介绍另外一种高性能IO模型: Proactor。为什么是 Proactor 模式上篇文章 【死磕 NIO】— Reactor 模式就一定意味着高性能吗?大明哥分析了 Reactor模式,我们知道Reactor性能确实非常高,适合高并发场景,但是它依然存在一个问题,那就是它是 同步IO。同步IO会有一个什么问题呢?同步IO需要线程自己等待内核准备好数据,在内原创 2021-11-09 08:30:00 · 695 阅读 · 2 评论 -
【死磕 NIO】— Reactor 模式就一定意味着高性能吗?
大家好,我是大明哥,我又来了。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnP3zhp5-1634901215489)(http://www.cmsblogs.com/images/group/sike-java/sike-nio/nio-2021101310001.png)]为什么是 Reactor一般所有的网络服务,一般分为如下几个步骤:读请求(read request)读解析(read decode)处理程序(process service)原创 2021-10-22 19:14:50 · 660 阅读 · 0 评论 -
【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?
通过上篇文章(【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞、非阻塞、异步、非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO。要想彻底弄清楚这五种IO模型,我们需要先弄清楚几个基本概念。基本概念什么是IO什么是IO?维基百科上面是这样解释的:I/O(英语:Input/Output),即输入/输出,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统(例如计算机)与外部世界(可能是人原创 2021-10-08 12:00:00 · 785 阅读 · 0 评论 -
【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚
万事从最基本的开始。要想完全掌握 NIO,并不是掌握上面文章(【死磕NIO】— NIO基础详解)中的三大组件就可以了,我们还需要掌握一些基本概念,如什么是 IO,5 种IO模型的区别,什么是阻塞&非阻塞等等,只有掌握了这些基本概念,我们对NIO才能理解得更加得心应手。这篇文章我们就从阻塞&非阻塞,同步&异步说起。同步与异步什么是同步与异步呢?百度百科是这样定义的:同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。异步与同步相对(这解释让我无言相对).原创 2021-09-21 22:35:08 · 633 阅读 · 0 评论 -
【死磕NIO】— NIO基础详解
Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计。Java NIO 由三个核心组件组件:BufferChannelSelector1缓冲区 BufferBuffer 是一个数据对象,我们可以把它理解为固定数量的数据的容器,它包含一些要写入或者读出的数据。在 Java NIO 中,任何时候访问 NIO 中的数据,都需要通过缓冲区(Buffer)进行操作。读取数据时,直接从缓冲区中读取,写入数据时,写入至缓冲区。NIO 最常原创 2021-09-08 23:08:02 · 1943 阅读 · 7 评论 -
【死磕 Java 基础】 — 你以为异常就是 try…catch ?那你天真了
大家好,我是大明哥。个人网站:https://www.cmsblogs.com/前言我敢说对于很多小伙伴来说,他们以为在 Java 中异常就是 try...catch,稍微有点儿意识的还会用下 throw new Exception,真的有这么简单吗?请宽恕小编直言,你对 Java 异常一知半解。以下是小编对 Java 异常的理解,如有错误之处,请原谅,资质有限。引出异常先问一个问题,在 Java 中,你是赞同使用返回码还是异常来规范错误呢?我先来说说使用返回码的情况,比如登录逻辑,我们分.原创 2021-08-08 21:17:49 · 4071 阅读 · 26 评论 -
【死磕Java并发】-----分析 ArrayBlockingQueue 构造函数加锁问题
原文出处http://cmsblogs.com/ 『chenssy』昨天有位小伙伴问我一个 ArrayBlockingQueue 中的一个构造函数为何需要加锁,其实这个问题我还真没有注意过。主要是在看 ArrayBlockingQueue 源码时,觉得它很简单,不就是通过加锁的方式来操作一个数组 items 么,有什么难的,所以就没有关注这个问题,所以它一问我懵逼了。回家细想了下,所以产生这篇博客原创 2017-11-30 21:46:23 · 3467 阅读 · 2 评论 -
【死磕Java并发】-----J.U.C之Java并发容器:ConcurrentHashMap
此篇博客所有源码均来自JDK 1.8HashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,put操作是有可能产生死循环的,导致CPU利用率接近100%。为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)两种解决方案,但是这两种方案都是对读写加锁,独占式,一个线程在读时其他线程必须等待,吞吐量较低,性能较原创 2017-06-20 22:18:02 · 10237 阅读 · 5 评论 -
【死磕Java并发】-----J.U.C之并发工具类:CyclicBarrier
此篇博客所有源码均来自JDK 1.8CyclicBarrier,一个同步辅助类,在API中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 通俗点讲就原创 2017-04-13 18:06:41 · 8017 阅读 · 1 评论 -
【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
此篇博客所有源码均来自JDK 1.8重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低。所以就提供了读写锁。读写锁维护着一对锁,一个读锁和一个写锁。通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时原创 2017-03-29 09:21:31 · 7060 阅读 · 1 评论 -
【死磕Java并发】-----J.U.C之深入分析CAS
原文出处:https://www.topjava.cn/category/1391296887813967872 『chenssy』CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作。整个AQS同步组件、Atomic原子类操作等等都是以CAS实现的,甚至ConcurrentHashMap在1.8的版本中也调整为了CAS+Synchronized。可以说CAS是整个JUC的基石。CAS分析在CAS中有.原创 2021-06-22 22:51:53 · 248 阅读 · 0 评论 -
【死磕Java并发】-----J.U.C之阻塞队列:PriorityBlockingQueue
原文出处http://cmsblogs.com/ 『chenssy』我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那么有没有一个队列可以支持优先级呢? Priori原创 2017-07-31 08:58:16 · 6569 阅读 · 4 评论 -
【死磕Java并发】-----J.U.C之Java并发容器:ConcurrentLinkedQueue
原文出处http://cmsblogs.com/ 『chenssy』要实现一个线程安全的队列有两种方式:阻塞和非阻塞。阻塞队列无非就是锁的应用,而非阻塞则是CAS算法的应用。下面我们就开始一个非阻塞算法的研究:CoucurrentLinkedQueue。ConcurrentLinkedQueue是一个基于链接节点的无边界的线程安全队列,它采用FIFO原则对元素进行排序。采用“wait-free”算原创 2017-07-08 21:26:10 · 9903 阅读 · 8 评论 -
【死磕 Java 并发】----- synchronized 的锁膨胀过程
原文出处:https://www.topjava.cn/category/1391296887813967872 『chenssy』synchronized 是 Java 面试的常客,我们需要掌握它的基本使用,比如同步代码块、同步普通方法、同步静态方法,以及他们的区别,当然这是最初级的。高级点的就是需要掌握 synchronized 的实现原理,比如对象头、synchronized 的锁优化、锁的膨胀过程,这篇文章就是介绍 synchronized 的锁膨胀过程。该过程其实很多小伙伴都不知道,18年.原创 2021-06-22 23:03:57 · 531 阅读 · 0 评论 -
【死磕Java并发】-----J.U.C之AQS:AQS简介
Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略(【死磕Java并发】—–深入分析synchronized的实现原理),但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可原创 2017-03-05 22:26:36 · 16442 阅读 · 2 评论 -
【死磕Java并发】-----J.U.C之并发工具类:Semaphore
此篇博客所有源码均来自JDK 1.8信号量Semaphore是一个控制访问多个共享资源的计数器,和CountDownLatch一样,其本质上是一个“共享锁”。Semaphore,在API是这么介绍的:一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。原创 2017-05-03 18:12:09 · 6008 阅读 · 4 评论 -
【死磕Java并发】-----J.U.C之阻塞队列:LinkedTransferQueue
原文出处http://cmsblogs.com/ 『chenssy』前面提到的各种BlockingQueue对读或者写都是锁上整个队列,在并发量大的时候,各种锁是比较耗资源和耗时间的,而前面的SynchronousQueue虽然不会锁住整个队列,但它是一个没有容量的“队列”,那么有没有这样一种队列,它即可以像其他的BlockingQueue一样有容量又可以像SynchronousQueue一样不会原创 2017-09-24 20:52:16 · 4445 阅读 · 3 评论 -
【死磕Java并发】-----J.U.C之线程池:ThreadPoolExecutor
原文出处http://cmsblogs.com/ 『chenssy』作为Executor框架中最核心的类,ThreadPoolExecutor代表着鼎鼎大名的线程池,它给了我们足够的理由来弄清楚它。下面我们就通过源码来一步一步弄清楚它。内部状态线程有五种状态:新建,就绪,运行,阻塞,死亡,线程池同样有五种状态:Running, SHUTDOWN, STOP, TIDYING, TERMINATED原创 2017-10-07 22:02:28 · 5140 阅读 · 4 评论 -
【死磕Java并发】-----Java内存模型之总结
经过四篇博客阐述,我相信各位对Java内存模型有了最基本认识了,下面LZ就做一个比较简单的总结。总结JMM规定了线程的工作内存和主内存的交互关系,以及线程之间的可见性和程序的执行顺序。一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译器和处理器的限制要尽可能地放松。JMM对程序员屏蔽了CPU以及OS内存的使用问题,能够使程序在不同的CPU和OS内存上都能够达到预期的效果。Java采用内存原创 2017-03-03 12:58:24 · 7069 阅读 · 6 评论 -
【死磕Java并发】-----深入分析volatile的实现原理
通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本更加低,因为它不会引起线程上下文的切换和调度。Java语言规范对volatile的定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更原创 2017-02-08 17:51:54 · 5449 阅读 · 6 评论 -
【死磕Java并发】-----J.U.C之Copy-On-Write容器
原文出处:https://www.topjava.cn/category/1391296887813967872 『chenssy』集合在我们开发中是使用得非常多的,包括在并发环境,我们知道Map接口在高并发时可以使用ConcurrentHashMap,但是List、Set貌似没有相应的ConcurrentList、ConcurrentSet,那么怎么解决List、Set高并发环境下的使用呢?第一种使用锁。也就是在get、remove、add等操作时增加Lock锁,如下:add(E e){ l.原创 2021-06-22 22:57:39 · 222 阅读 · 0 评论 -
我肝了整整一年才肝出来这份 Java 并发的系列文章,无私奉献给你们
【死磕 Java 并发】系列是 LZ 在 2017 年写的第一个死磕系列,一直没有做一个合集,这篇博客则是将整个系列做一个概览。先来一个总览图:【高清图,请关注“Java技术驿站”公众号,回复:脑图JUC】【死磕Java并发】—–深入分析synchronized 的实现原理synchronized 可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。深入分析 synchronized 的内在实现机制,锁优化、锁升级过程。【死磕Jav原创 2021-06-22 23:22:00 · 560 阅读 · 2 评论