随笔分类 - Java
使用 Java 示例介绍无锁数据结构-Java快速进阶教程
摘要:1. 简介 在本教程中,我们将了解什么是非阻塞数据结构,以及为什么它们是基于锁的并发数据结构的重要替代方案。 首先,我们将介绍一些术语,例如无障碍、无锁定和无等待。 其次,我们将研究非阻塞算法的基本构建块,如CAS(compare-and-swap)。 第三,我们将研究在Java中实现无锁队列,最后
阅读全文
AtomicStampedReference 指南-Java快速进阶教程
摘要:1. 概述 在之前的一篇文章中,我们了解到AtomicStampedReference可以防止ABA问题。 在本教程中,我们将仔细研究如何最好地使用它。 2. 为什么我们需要AtomicStampedReference? 首先,AtomicStampedReference为我们提供了一个对象引用变量
阅读全文
并发中的 ABA 问题-Java快速进阶教程
摘要:1. 简介 在本教程中,我们将介绍并发编程中 ABA 问题的理论背景。我们将看到它的根本原因以及解决方案。 2. 比较和交换 为了了解根本原因,让我们简要回顾一下比较和交换的概念。 比较和交换 (CAS) 是无锁算法中的常用技术,用于确保一个线程对共享内存的更新在另一个线程同时修改相同空间时失败。
阅读全文
sun.misc.Unsafe使用指南-Java快速进阶教程
摘要:1. 概述 在本文中,我们将看看JRE提供的一个引人入胜的类 - 不安全的sun.misc包。此类为我们提供了低级机制,这些机制旨在仅供核心 Java 库使用,而不能由标准用户使用。 这为我们提供了主要为核心库内部使用而设计的低级机制。 2. 获取不安全的实例 首先,为了能够使用Unsafe类,我们
阅读全文
Java 中的原子变量简介-Java快速进阶教程
摘要:1. 简介 简而言之,当涉及并发时,共享可变状态很容易导致问题。如果未正确管理对共享可变对象的访问,应用程序很快就会变得容易出现一些难以检测的并发错误。 在本文中,我们将重新审视使用锁来处理并发访问,探讨与锁相关的一些缺点,最后引入原子变量作为替代方案。 2. 锁 让我们来看看: public cl
阅读全文
Java 中的 ThreadLocal 简介-Java快速进阶教程
摘要:1. 概述 在本教程中,我们将研究java.lang包中的ThreadLocal构造。这使我们能够单独存储当前线程的数据,并简单地将其包装在特殊类型的对象中。 2.ThreadLocal 接口 TheadLocal构造允许我们存储只能由特定线程访问的数据。 假设我们想要一个将与特定线程捆绑在一起的I
阅读全文
什么是线程安全以及如何实现它-Java快速进阶教程
摘要:1. 概述 Java 支持开箱即用的多线程。这意味着通过在单独的工作线程中并发运行字节码,JVM能够提高应用程序性能。 虽然多线程是一个强大的功能,但它是有代价的。在多线程环境中,我们需要以线程安全的方式编写实现。这意味着不同的线程可以访问相同的资源,而不会暴露错误行为或产生不可预知的结果。这种编程
阅读全文
Java 19 中的结构化并发-Java快速进阶教程
摘要:1. 概述 在本教程中,我们将讨论孵化器功能结构化并发 (JEP 428),它为 Java 19 提供了结构化并发功能。我们将指导你使用新的 API 来管理多线程代码。 2. 理念 通过采用并发编程风格来降低线程泄漏和取消延迟的可能性,从而增强多线程代码的可维护性、可靠性和可观察性,这是与取消和关闭
阅读全文
延迟队列使用指南-Java快速进阶教程
摘要:1. 概述 在本文中,我们将研究java.util.concurrent包中的DelayQueue构造。这是一个阻塞队列,可用于生产者-消费者程序。 它有一个非常有用的特性——当消费者想要从队列中获取一个元素时,他们只能在该特定元素的延迟到期时获取它。 2. 为延迟队列中的元素实现延迟 我们要放入D
阅读全文
RabbitMQ简介-Java快速进阶教程
摘要:1. 概述 软件组件的解耦是软件设计中最重要的部分之一。实现此目的的一种方法是使用消息传递系统,它提供组件(服务)之间的异步通信方式。在本文中,我们将介绍其中一个系统:RabbitMQ。 RabbitMQ 是一个实现高级消息队列协议 (AMQP) 的消息代理。它为主要编程语言提供客户端库。 除了用于
阅读全文
使用 Spring AMQP 进行消息传递-Java快速进阶教程
摘要:1. 概述 在本教程中,我们将探索使用 Spring AMQP 框架通过 AMQP 进行基于消息的通信。首先,我们将介绍消息传递的一些关键概念。然后,我们将继续一个实际示例。 2. 基于消息的通信 消息传递是一种在应用程序之间进行通信的技术。它依赖于异步消息传递,而不是基于同步请求响应的体系结构。消
阅读全文
使用 Spring AMQP 进行错误处理-Java快速入门教程
摘要:1. 简介 异步消息传递是一种松散耦合的分布式通信,在实现事件驱动体系结构方面越来越流行。幸运的是,Spring框架提供了 SpringAMQP 项目,允许我们构建基于AMQP的消息传递解决方案。 另一方面,在此类环境中处理错误可能是一项艰巨的任务。因此,在本教程中,我们将介绍处理错误的不同策略。
阅读全文
死锁、活锁和饥饿-架构快速进阶教程
摘要:1. 简介 在多进程并发环境中,多个进程可能会争用一组有限的资源。如果进程请求资源,而该资源当前不可用,则进程将等待该资源。有时,此等待过程永远不会成功访问资源。这种对资源的等待会导致三种情况——死锁、活锁和饥饿。 在本教程中,我们将讨论这三个条件。 2. 死锁 在本节中,我们将首先讨论死锁、其必要
阅读全文
Java 线程死锁和活锁-Java快速进阶教程
摘要:1. 概述 虽然多线程有助于提高应用程序的性能,但它也带来了一些问题。在本教程中,我们将在 Java 示例的帮助下研究两个这样的问题,死锁和活锁。 2. 死锁 2.1. 什么是死锁? 当两个或多个线程永远等待另一个线程持有的锁或资源时,就会发生死锁。因此,应用程序可能会停止或失败,因为死锁线程无法进
阅读全文
Java中的梯度下降-Java快速进阶教程
摘要:1. 简介 在本教程中,我们将了解梯度下降算法。我们将在 Java 中实现该算法并逐步说明它。 2. 什么是梯度下降? 梯度下降是一种优化算法,用于查找给定函数的局部最小值。它广泛用于高级机器学习算法中,以最小化损失函数。 坡度是坡度的另一个词,下降意味着下降。顾名思义,梯度下降沿着函数的斜率向下,
阅读全文
线性回归与逻辑回归-AI快速进阶系列
摘要:1. 概述 在本教程中,我们将研究线性回归和逻辑回归之间的异同。 我们将首先研究回归的概念。通过这种方式,我们将看到回归与科学中的还原论方法的关系。 然后,我们将按顺序研究线性回归和逻辑回归。我们还将提出两种回归方法在特征向量和目标变量方面的形式化。 最后,我们将研究对可观察量执行回归的两种方法之间
阅读全文
决策树与随机森林-AI快速进阶系列
摘要:1. 简介 在本教程中,我们将展示决策树和随机森林之间的区别。 2. 决策树 决策树是一个树形模型,指导我们检查对象的特征以输出其离散或连续标签。例如,这里有一棵树,根据天气状况预测一天是否适合在户外玩耍: 内部节点告诉我们要检查哪些特征,叶子揭示树的预测。他们如何产生预测?每个叶子都包含训练数据集
阅读全文
随机森林与极度随机化树-AI快速进阶系列
摘要:1. 简介 在本教程中,我们将回顾随机森林 (RF) 和极端随机树 (ET):它们是什么、它们的结构以及它们有何不同。 2. 定义 随机森林和极端随机树属于一类称为集成学习算法的算法。集成学习算法利用许多学习算法的强大功能来执行任务。例如,在分类任务中,集成学习算法可以聚合来自多个不同分类器的预测以
阅读全文
计算机科学中的谓词-Java快速进阶教程
摘要:1. 简介 谓词问一个问题,答案是真还是假,或者换句话说,是或否。 在计算机科学和数学中,这个问题以函数的形式出现。函数的结果为真或假(是或否)。答案的数据类型,同样在数学和计算机科学中都称为布尔值。 在本教程中,我们将通过一些示例更深入地介绍这些概念。 2. 简单定义 谓词是一组参数的函数,该参数
阅读全文
什么是交叉熵-AI快速进阶系列
摘要:1. 概述 在本教程中,我们将研究机器学习交叉熵的定义。 我们将首先讨论信息论中的熵的概念及其与监督学习的关系。 然后,我们将看到如何从单变量分布中的熵定义中推导出二元分布中的交叉熵。这将使我们很好地理解一个如何概括另一个。 最后,我们将看到如何使用交叉熵作为损失函数,以及如何通过梯度下降来优化模型
阅读全文