0%

Lock接口及其实现类:Java 并发编程的灵活锁机制

Lock 接口是 JDK 5 引入的同步工具,为 Java 并发编程提供了比 synchronized 更灵活的锁控制能力。它支持显式加锁 / 解锁、可中断获取、超时获取等特性,弥补了 synchronized 隐式操作的局限性。本文将深入解析 Lock 接口的核心实现类(ReentrantLockReentrantReadWriteLock),并对比其与 synchronized 的差异。

Lock 接口核心方法

Lock 接口定义了锁的基本操作,核心方法如下:

方法 作用描述
lock() 获取锁(阻塞式,直到获取成功)
lockInterruptibly() 可中断地获取锁(获取过程中若线程被中断,会抛出 InterruptedException
tryLock() 尝试非阻塞获取锁(成功返回 true,失败返回 false
tryLock(long timeout, TimeUnit unit) 超时获取锁(超时未获取则返回 false
unlock() 释放锁(必须在 finally 块中调用,避免锁泄漏)
newCondition() 创建条件对象,实现线程间通信(类似 synchronizedwait/notify

ReentrantLock:可重入独占锁

ReentrantLockLock 接口的最常用实现,提供与 synchronized 类似的独占锁功能,但支持更灵活的控制。其核心特性是可重入性(同一线程可多次获取锁)和公平 / 非公平模式

公平锁与非公平锁

ReentrantLock 允许通过构造函数指定锁的公平性:

1
2
3
4
// 非公平锁(默认)  
Lock lock = new ReentrantLock();
// 公平锁
Lock fairLock = new ReentrantLock(true);
(1)非公平锁(NonfairSync)
  • 获取逻辑:线程尝试直接获取锁(CAS 操作),失败后才进入等待队列;
  • 特点:可能存在线程饥饿(先请求的线程后获取锁),但吞吐量更高;
  • 适用场景:并发激烈但允许偶尔不公平的场景。
(2)公平锁(FairSync)
  • 获取逻辑:线程必须按请求顺序进入队列,只有队首线程能获取锁;
  • 特点:保证公平性,避免饥饿,但频繁的上下文切换导致吞吐量较低;
  • 适用场景:对公平性要求高的场景(如资源调度)。

核心源码解析

ReentrantLock 基于 AQS(AbstractQueuedSynchronizer)实现,内部通过 Sync 抽象类区分公平与非公平逻辑:

获取锁(lock() 方法)
阅读全文 »

Mac 强制退出卡住的应用:快捷方式与替代方法

当 Mac 上的应用程序无响应(卡住、闪退或无法操作)时,无需重启电脑,只需强制退出该应用即可恢复系统流畅性。最便捷的方式是使用快捷键 Option + Command + Esc,以下是详细操作及替代方法:

快捷键强制退出(推荐)

  1. 按下组合键:同时按住 Option(⌥) + Command(⌘) + Esc,弹出 “强制退出应用程序” 窗口。
  2. 选择目标应用:在列表中找到无响应的应用(通常标记为 “未响应”)。
  3. 强制退出:点击窗口右下角的 “强制退出” 按钮,应用将被立即关闭。

优势:操作最快,适合紧急情况(如应用卡死导致鼠标无法移动时)。

通过 Dock 栏强制退出

若应用在 Dock 栏有图标,可右键操作:

  1. 右键点击 Dock 栏中的应用图标(如卡住的浏览器)。
  2. 按住 Option 键:此时菜单中的 “退出” 会变为 “强制退出”
  3. 点击 “强制退出”:应用将被关闭。
阅读全文 »

Hibernate 深度解析:从 ORM 思想到核心实践

Hibernate 是 Java 生态中经典的全自动化 ORM(Object-Relational Mapping,对象关系映射)框架,它彻底改变了传统 JDBC 开发中 “代码与 SQL 强耦合” 的问题,让开发者能以 “操作 Java 对象” 的方式间接操作数据库,大幅提升了开发效率并降低了数据库操作的复杂度。以下从核心概念、核心组件、使用特点及扩展能力等维度,对 Hibernate 进行系统梳理。

基础:ORM 思想与价值

在理解 Hibernate 前,需先明确其底层依赖的 ORM 思想—— 这是 Hibernate 设计的核心基石。

ORM 定义

ORM(对象关系映射)是一种编程技术,用于解决 “面向对象编程(OOP)” 与 “关系型数据库(RDB)” 之间的模型差异:

  • 数据映射:将数据库中的 “表” 映射为 Java 中的 “类”,“表的字段” 映射为 “类的属性”,“表的一条记录” 映射为 “类的一个实例对象”。
  • 操作映射:将数据库的 “CRUD 操作”(如 INSERT/SELECT/UPDATE/DELETE)转化为 Java 对象的 “方法调用”(如 session.save()/session.get()/session.update()/session.delete())。

ORM 实现核心:元数据

ORM 的映射规则需要通过元数据来描述,Hibernate 支持两种主流元数据格式:

  • XML 配置文件:传统方式,通过.hbm.xml文件(如User.hbm.xml)明确指定 “类与表”“属性与字段” 的映射关系,例如:

阅读全文 »

解决 Homebrew 安装软件时的 “Failed to upgrade Homebrew Portable Ruby” 错误

当使用 brew 安装软件时遇到 “Checksum mismatch” 并导致 “Failed to upgrade Homebrew Portable Ruby” 错误,通常是由于缓存的 Ruby 安装包损坏或校验不一致导致的。以下是详细的解决步骤:

错误原因分析

从错误信息可以看到:

  • 预期的校验和(Checksum)与实际下载文件的校验和不匹配
  • 问题文件是缓存中的 portable-ruby-2.6.8.yosemite.bottle.tar.gz
  • 这通常是因为下载过程中断、文件损坏或镜像源同步问题导致的

解决方案:删除损坏的缓存文件

  1. 删除错误提示中指定的缓存文件
    执行错误信息中建议的删除命令(路径需根据你的实际情况修改):

    1
    rm -rf /Users/zhanghe/Library/Caches/Homebrew/portable-ruby-2.6.8.yosemite.bottle.tar.gz
  2. 重新运行安装命令
    再次尝试安装你需要的软件(以 Docker 为例):

    1
    brew install --cask --appdir=/Applications docker

    此时 Homebrew 会重新下载完整的 Ruby 安装包,由于删除了损坏的缓存,通常能解决校验和不匹配的问题。

若问题依旧:更新 Homebrew 并清理缓存

如果上述方法无效,可以尝试更新 Homebrew 并清理所有缓存:

  1. 更新 Homebrew

    1
    brew update
  2. 清理所有缓存文件

    1
    brew cleanup
  1. 再次尝试安装

    1
    brew install --cask --appdir=/Applications docker

Mac 中显示 / 隐藏以 . 开头的文件(含.git 文件)

对于刚使用 Mac 的用户来说,经常会遇到 “明明存在的文件却看不到” 的情况,尤其是像 .git 这类以英文句号(.)开头的隐藏文件。这其实是 Mac 系统的默认设置,以下是详细说明和操作方法:

为什么 .git 文件看不到?

在 Unix/Linux 系统(Mac 基于 Unix 内核)中,. 开头的文件 / 文件夹默认被标记为 “隐藏文件”,目的是避免用户误操作系统关键文件(如 .bash_profile.ssh 等)。
.git 文件夹是 Git 版本控制的核心文件,包含仓库配置、分支信息、提交历史等,属于隐藏文件,因此默认不显示。

快速显示 / 隐藏隐藏文件:快捷键

最便捷的方式是使用系统快捷键,适用于任何文件夹窗口:

  • 显示隐藏文件:在打开的文件夹中,按下 Command(⌘) + Shift(⇧) + .(句号)
  • 隐藏隐藏文件:再次按下同样的组合键 Command + Shift + .

效果:按下后,文件夹中会立即显示所有隐藏文件(名称通常为灰色,与普通文件区分),包括 .git.DS_Store 等。

通过终端命令永久显示隐藏文件(可选)

如果需要长期显示隐藏文件,可通过终端命令修改系统设置:

阅读全文 »