
Java 秒懂小文
文章平均质量分 88
Java秒懂小文是一个适合不同水平Java开发者的专栏,无论是初学者还是希望进阶的开发者都能从中获益。通过订阅专栏,读者不仅可以学习到系统的Java知识,还可以通过提供的额外资源和社区交流来加深理解和应用所学知识。
一名技术极客
在代码的海洋里,我是一名不断航行的探索者。热爱Java,热衷于深入挖掘技术细节,享受解决复杂问题的成就感。这里是我的优快云博客,记录我在编程路上的学习笔记、项目实践和对新技术的思考。
作为一名拥有多年开发经验的Java程序员,我深知学习过程中的困难与挑战。因此,我的博客会尽量用简明的语言去阐释复杂的概念,分享实用的编程技巧,以及那些在我工作过程中积累的宝贵经验。无论是初学者还是资深开发者,我都希望这里的内容能对您有所帮助。
在这个快速变化的技术世界,让我们一起保持好奇心,不断学习,共同进步。欢迎留言讨论,期待与您一起探讨编程之美!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Collection - PriorityQueue 源码解读
前面以为例讲解了Stack和Queue,其实还有一种特殊的队列叫做,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(),也可以通过构造时传入的比较器(Comparator,类似于C++的仿函数)。Java中实现了Queue接口,不允许放入null元素;其通过堆实现,具体说是通过完全二叉树(原创 2024-11-29 10:19:08 · 666 阅读 · 1 评论 -
Collection - ArrayDeque 源码解读
要讲栈和队列,首先要讲Deque接口。Deque的含义是“double ended queue”,即双端队列,它既可以当作栈使用,也可以当作队列使用。说明add(e)addLast(e)向队尾插入元素,失败则抛出异常offer(e)向队尾插入元素,失败则返回falseremove()获取并删除队首元素,失败则抛出异常poll()获取并删除队首元素,失败则返回nullelement()getFirst()获取但不删除队首元素,失败则抛出异常peek()获取但不删除队首元素,失败则返回null。原创 2024-11-29 10:02:17 · 1038 阅读 · 0 评论 -
Collection - LinkedList 源码解读
LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(它是个接口名字)。原创 2024-11-29 09:39:23 · 570 阅读 · 0 评论 -
Collection - ArrayList 源码解析
ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供的语法糖,所以这里的数组是一个Object数组,以便能够容纳任何类型的对象。原创 2024-11-29 09:30:51 · 523 阅读 · 0 评论 -
java之lambda表达式&stream流式编程操作集合最佳实践以及示例代码
Stream API 的主要特点包括:Stream API 提供了一种简洁的方式来处理集合数据,使得代码更加易读、易写。Stream API 的操作可以链式调用,使得代码更加清晰、易读。Stream API 支持并行处理,可以充分利用多核处理器的能力。Stream API 的操作是惰性求值的,即只有在需要结果时才会执行操作。Stream API 的无状态操作不会改变流中的元素,也不会改变流的状态。Stream API 的有状态操作会改变流的状态,或者依赖于流中的其他元素。原创 2024-11-28 18:49:16 · 1191 阅读 · 0 评论 -
你管这破玩意儿叫负载均衡?
架构一定要结合业务的实际情况来设计,脱离业务谈架构其实是耍流氓,可以看到上文每一个架构的衍化都与我们的业务发展息息相关,对于中小型流量没有那么大的公司,其实用 Nginx 作为负载均衡足够,在流量迅猛增长后则考虑使用 lvs+nginx,当然像美团这样的巨量流量(数十 Gbps的流量、上千万的并发连接),lvs 也不管用了(实测虽然使用了 lvs 但依然出现了不少丢包的现象)所以它们开发出了自己的一套四层负载均衡器 MGW。原创 2024-05-30 09:04:28 · 1248 阅读 · 0 评论 -
19、秒懂 Java wait() 和 notify() 方法
本文,我们来讲解下 Java 并发中的基础的基础,核心的核心,Java 并发编程中的最基本的机制之一 -「 线程同步 」。为了方便你理解并发编程中的各种概念和术语,我们首先会来一阵扫盲,讨论一些基本的并发相关术语和方法。接着,我们将开发一个简单的应用程序,并在合格应用程序里处理并发问题,以方便大家理解和巩固wait()和notify()。原创 2024-05-09 09:16:49 · 755 阅读 · 0 评论 -
18、秒懂 Java 之 Runnable 还是 Thread ?
写Java 代码的时候,我们经常会有这样的疑问:我到底是实现一个 Runnable 呢,还是扩展一个 Thread 类?你的答案是什么呢?那有没有标准答案呢?答案是什么呢?我们先来分析下,看看哪种方法在实践中更有意义以及为什么?原创 2024-05-09 08:58:51 · 777 阅读 · 0 评论 -
17、秒懂 Java Thread 生命周期
本文中,我想详细的讨论下 Java 中的核心概念 - 线程的生命周期。我会使用一张我自制的图片加上实用的代码片段,一步一步的详细剖析线程的各个状态和各个状态之间如何转换。原创 2024-05-08 10:44:56 · 1006 阅读 · 0 评论 -
16、秒懂 Java ThreadLocalRandom
随机数生成是一个非常常见的操作,而且 Java 也提供了类用于生成随机数,而且呢,这个类也是线程安全的,就是有一点不好,在多线程下,它的性能不佳。为什么多线程下,Random 的性能不佳?因为,它采用了多个线程共享一个 Random 实例。这样就会导致多个线程争用。为了解决这个问题,Java 7 引入了类,用于在多线程环境中生成随机数。本文接下来的部分,就来看看如何如何执行以及如何在实际应用程序中使用它。原创 2024-05-08 08:49:00 · 1109 阅读 · 0 评论 -
15、秒懂 Java java.util.concurrent.Future
Java 在并发方面引入了 「 将来 」( Future )这个概念。把所有不在主线程执行的代码都附加了将来这个灵魂。主线程只负责其它并发线程的创建、启动、监视和处理并发线程完成任务或发生异常时的回调。其它情况,则交给并发线程自己去处理。而双方之间的沟通,就是通过一个个被称之为 「 将来 」 的类出处理。Future 定义在 java.util.concurrent包中,这是一个接口,自 Java 1.5以来一直存在的接口,用于处理异步调用和处理并发编程。原创 2024-05-08 08:41:27 · 776 阅读 · 0 评论 -
14、秒懂 Java 守护线程 ( Daemon Thread )
在这篇简短的文章中,我们将讲解下 Java 中的守护线程,看看它们可以做什么。我们还将解释守护线程和用户线程之间的区别。原创 2024-05-08 08:30:42 · 600 阅读 · 0 评论 -
13、秒懂 Java java.util.concurrent.Locks
对于Java 来讲,锁 ( Lock ) 是一种比标准同步块 ( synchronized block ) 更灵活,更复杂的线程同步机制。其实,Java 1.5 就已经存在 Lock 接口了。这个 Lock 接口在 java.util.concurrent.lock 包中定义,提供了大量的锁操作。本文中,我们将讲解 Lock 接口的不同实现并介绍如何在应用程序中使用锁。原创 2024-05-06 08:51:29 · 1036 阅读 · 0 评论 -
12、秒懂 Java BlockingQueue
本文中,我们将介绍一个 java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类 - BlockQueue。我们将介绍BlockingQueue 接口的 API 以及如何使用该接口的方法使编写并发程序更容易。在本文的后面,我们将展示一个具有多个生产者线程和多个消费者线程的简单程序的示例。原创 2024-04-30 14:53:52 · 484 阅读 · 0 评论 -
11、秒懂 Java CountDownLatch
本章节我们来讨论下 java.util.concurrent.CountDownLatch 这个类,顺带演示下如何在一些实际例子中使用它。CountDownLatch 类的作用呢?怎么说呢?简单来说,我们可以使用它来阻塞线程,直到其他线程完成给定任务。原创 2024-04-30 14:31:54 · 823 阅读 · 0 评论 -
10、秒懂系列之 Java 并发编程面试题
守护线程是一个不阻止Java虚拟机(JVM)退出的线程当所有非守护线程终止时,JVM只是放弃所有剩余的守护线程;守护线程通常用于为其他线程执行一些支持或服务任务,但我们应该考虑到它们可能随时被放弃;要将一个线程作为守护线程启动,应该在调用start()之前使用setDaemon()方法设置为守护线程如下所示;"));额外的奇怪的是,如果将上面的代码放在 main() 内运行,则可能无法打印该消息。而发生这种情况的原因,是因为 main() 线程在守护线程运行到打印消息之前就已经终止。原创 2024-04-30 14:13:07 · 820 阅读 · 0 评论 -
09、秒懂 Java CompletableFuture ( 下 )
上一章节中我们讲解了 CompletableFuture 的一些基本用法,比如如何使用和如何处理异步计算结果。本章节我们继续,主要讲解如何使用 CompletableFuture 来组合异步计算的结果。原创 2024-04-30 13:43:22 · 427 阅读 · 0 评论 -
08、秒懂 Java CompletableFuture ( 上 )
本文我们来了解下 Java 8 引入的 CompletableFuture 类,了解下该类提供的功能和用例。原创 2024-04-29 09:00:58 · 717 阅读 · 0 评论 -
07、秒懂 Java Google Guava 实现
Guava 是托管在 Github.com 上的流行的 Google 开源的 Java 线程池库。Guava 包含了许多有用的并发类,同时还包含了几个方便的 ExecutorService 实现,但这些实现类都无法通过直接实例化或子类化来创建实例。取而代之的是提供了 MoreExecutors 助手类来创建它们的实例。原创 2024-04-29 08:52:44 · 1540 阅读 · 0 评论 -
06、秒懂 Java ForkJoinPool
在fork/join 框架中,任何任务都可以生成 ( fork ) 多个子任务并使用 join() 方法等待它们的完成。fork/join 框架的好处是它不会为每个任务或子任务创建新线程,而是实现了 工作窃取 ( Work Stealing ) 算法。因为,即使是使用一个简单的 ThreadPoolExecutor ,也会在不断的递归中快速耗尽线程。在这个示例中,树是一个由节点,int 值和一组子节点组成。每个任务都接收自己的节点,并将其值添加到其子节点的值之和上。原创 2024-04-28 10:50:17 · 347 阅读 · 0 评论 -
05、秒懂Java线程之 ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor 扩展自 一文秒懂 Java 线程池之 ThreadPoolExecutor 讲解的 了ThreadPoolExecutor 类,并且添加了其它方法实现了 ScheduledExecutorService 接口。原创 2024-04-28 10:42:45 · 206 阅读 · 0 评论 -
04、秒懂 Java 线程池之 ThreadPoolExecutor
因为上一章节篇幅有限,所以我决定把 一文秒懂 Java 线程池 拆分为三篇文章单独介绍。本章节,我们就来看看 ThreadPoolExecutor。原创 2024-04-26 11:43:04 · 558 阅读 · 0 评论 -
03、秒懂 Java 线程池 ( Thread Pool )
本文我们将讲解 Java 中的线程池 ( Thread Pool ),从 Java 标准库中的线程池的不同实现开始,到 Google 开发的 Guava 库的前世今生。本章节涉及到很多前几个章节中阐述的知识点。我们希望你是按照顺序阅读下来的,不然有些知识会一头雾水。Java 语言的实现中,把 Java 线程一一映射到操作系统级的线程,而后者是操作系统的资源,这意味着,如果开发者毫无节制地创建线程,那么线程资源就会被快速的耗尽。原创 2024-04-26 11:37:22 · 748 阅读 · 0 评论 -
02、秒懂 Java Fork-Join
fork/join 框架是 Java 7 中引入的 ,它是一个工具,通过 「 分而治之 」 的方法尝试将所有可用的处理器内核使用起来帮助加速并行处理。在实际使用过程中,这种 「 分而治之 」的方法意味着框架首先要 fork ,递归地将任务分解为较小的独立子任务,直到它们足够简单以便异步执行。然后,join 部分开始工作,将所有子任务的结果递归地连接成单个结果,或者在返回 void 的任务的情况下,程序只是等待每个子任务执行完毕。原创 2024-04-25 14:43:16 · 1156 阅读 · 0 评论 -
01、秒懂 Java ExecutorService
invokeAll() 方法将一组任务分配给 ExecutorService ,使每个任务执行,并以 Future 类型的对象列表的形式返回所有任务执行的结果在继续深入理解 ExecutorService 之前,我们必须先讲解下另外两件事:关闭 ExecutorService 和处理 Future 返回类型。原创 2024-04-25 14:30:47 · 1055 阅读 · 0 评论