在 Java 并发编程中,"锁" 是解决多线程安全问题最核心的工具。常见的锁包括:synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock、Semaphore、CountDownLatch / CyclicBarrier 等。
synchronized 是一种内置的 Java 关键字,用于实现线程同步。
当一个线程进入 synchronized 块或方法时,它会获得锁,而这把锁直接存储在 Java对象头中,从而阻止其他线程同时进入相同的 synchronized 块或方法,确保共享资源的互斥访问。
扩展:Java 对象头简述
以 Hotspot 虚拟机为例,对象头主要包含两部分:
- Mark Word:默认存储对象的 HashCode、分代年龄和锁标志位信息。它是一个非固定的数据结构,会根据对象的状态复用存储空间,运行期间存储的数据会随着锁标志位的变化而变化。
- Klass Pointer:对象指向它的类元数据的指针,虚拟机通过这个指针确定该对象属于哪个类的实例。
Java 对象头结构
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。
一、概念
单例模式(Singleton Pattern)的目标是确保一个类只有一个实例,并提供一个全局访问点。
环境准备
本文记录 MongoDB 的安装、配置、服务注册以及 mongosh 客户端安装过程。
文档以 MongoDB 8.x 为示例,适用于手动解压安装的场景。
下载安装包
-
MongoDB 服务端安装包
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel8-8.3.7.tgz -
MongoDB Shell 安装包
https://downloads.mongodb.com/compass/mongodb-mongosh-2.9.2.x86_64.rpm
本文基于 Nexus 3.95 版本、CentOS 系统进行安装介绍。
一、Nexus 简介
1.1 产品定位
Nexus Repository Manager(简称 Nexus)是 Sonatype 公司开发的一款业界领先的仓库管理平台,主要用于构建企业级私有仓库系统。它能够代理、存储和管理你的软件构件(Artifacts),是 Java / Maven 生态中最常用的私有仓库解决方案。
1.2 核心价值
- 构建加速:缓存远程中央仓库的依赖,避免重复从公网下载,大幅提升团队构建速度
- 带宽节省:团队内部共享同一份依赖缓存,减少重复下载带来的带宽浪费
- 内部构件共享:提供私有仓库用于存储和分发团队内部构建的私有 jar 包
- 安全管控:统一管理依赖的版本与来源,避免引入不安全的公共依赖漏洞
- 多格式支持:支持 Maven、npm、Docker、PyPI、Go Modules、Helm、RubyGems 等多种仓库格式
一、概述
什么是 Let's Encrypt
Let's Encrypt 是一个由 Internet Security Research Group (ISRG) 运营的非营利性证书颁发机构 (CA),致力于降低 HTTPS 部署的门槛。
核心特点:
- 免费:无需支付任何费用即可获取 SSL/TLS 证书
- 自动化:通过 Certbot 工具实现证书的申请、续期全自动化
- 开放标准:基于 ACME (Automated Certificate Management Environment) 协议
- 兼容性好:被所有主流浏览器和操作系统信任
导读:RocketMQ 主要用于解决系统内部耦合度过高、瞬间流量冲击等问题。它通过异步通信机制,实现了高性能、高可靠的消息传递。
RocketMQ 简介
RocketMQ 是一个 分布式消息中间件,可以看作是 “消息队列 + 分布式系统” 的结合体。
- 作为消息队列:遵循“发-存-收”模型(Producer-Broker-Consumer)。
- 作为分布式系统:由服务端(Broker)、客户端(Producer/Consumer)和注册中心(NameServer)组成。
Java 线程池(一):核心概念与基础实战
什么是线程池?
线程池(Thread Pool)是一种基于池化思想管理线程的工具,在多线程服务器中广泛应用,例如数据库连接池、HttpClient 连接池等。
它的核心思想是预先创建一定数量的线程并保存在池中。当有任务需要执行时,线程池会从空闲线程中取出一个来执行任务。任务执行完毕后,该线程会返还给线程池,而不是被销毁,以便后续任务复用。
为什么要使用线程池?
如果不使用线程池,线程的频繁创建与销毁、以及无限制的线程调度会带来巨大的开销,降低计算机的整体性能。线程池通过维护一组工作线程,避免了这些问题,保证了对系统资源的充分利用。
什么是 Maven Archetype?
Maven Archetype 是一个项目模板工具包。它能够帮助开发者创建可复用的项目模板,并通过参数化配置,快速生成符合特定结构和规范的新项目。使用动态骨架,可以极大地提升项目初始化的效率和标准化程度。
核心步骤概览
- 创建原型项目:搭建一个标准的、作为模板基础的项目结构。
- 生成元数据:通过 Maven 命令在原型项目的基础上生成 Archetype 元数据文件。
- 重命名模块为动态占位符 ⭐:把
archetype-resources/下写死的模块目录名改成__rootArtifactId__-xxx。 - 配置元数据:同步修改
archetype-metadata.xml与父pom.xml,定义动态参数和文件生成规则。 - 安装骨架:将配置好的动态骨架安装到本地 Maven 仓库,并用
jar tf验证内容。 - 使用骨架:通过 IDE 或 Maven 命令使用该骨架创建新项目。
Guava EventBus的原理学习