当前位置: 首页 > java >正文

利用aqs构建一个自己的非公平独占锁

功能

具备基本的加锁、解锁功能,并且是非公平的(即允许插队)。

代码

import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class MyNonfairLock {// 内部同步器类private static class Sync extends AbstractQueuedSynchronizer {// 尝试获取锁@Overrideprotected boolean tryAcquire(int acquires) {// 非公平锁直接尝试获取,不考虑队列中是否有等待线程final Thread current = Thread.currentThread();int c = getState();if (c == 0) {// CAS 操作尝试获取锁if (compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}}// 可重入支持else if (current == getExclusiveOwnerThread()) {int nextc = c + acquires;if (nextc < 0) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;}// 尝试释放锁@Overrideprotected boolean tryRelease(int releases) {int c = getState() - releases;if (Thread.currentThread() != getExclusiveOwnerThread())throw new IllegalMonitorStateException();boolean free = false;if (c == 0) {free = true;setExclusiveOwnerThread(null);}setState(c);return free;}// 是否被当前线程独占@Overrideprotected boolean isHeldExclusively() {return getExclusiveOwnerThread() == Thread.currentThread();}}// 创建同步器实例private final Sync sync = new Sync();// 加锁方法public void lock() {sync.acquire(1);}// 尝试加锁public boolean tryLock() {return sync.tryAcquire(1);}// 解锁方法public void unlock() {sync.release(1);}// 查询当前线程是否持有锁public boolean isHeldByCurrentThread() {return sync.isHeldExclusively();}// 查询锁是否被任何线程持有public boolean isLocked() {return sync.getState() != 0;}
}
  1. 非公平性实现:

在 tryAcquire 方法中,直接尝试获取锁(通过 CAS 操作),不考虑等待队列中是否有其他线程在等待

这与公平锁的区别在于公平锁会先检查队列中是否有等待线程

  1. 可重入支持:

如果当前线程已经是锁的持有者,则增加 state 计数

释放锁时需要释放相同次数

  1. 状态管理:

state = 0 表示锁未被占用

state > 0 表示锁被占用,且数值表示重入次数

  1. 独占模式:

只允许一个线程持有锁

使用 setExclusiveOwnerThread 和 getExclusiveOwnerThread 来跟踪锁的持有者

使用示例

public class MyLockExample {private static final MyNonfairLock lock = new MyNonfairLock();private static int counter = 0;public static void main(String[] args) throws InterruptedException {Runnable task = () -> {for (int i = 0; i < 10000; i++) {lock.lock();try {counter++;} finally {lock.unlock();}}};Thread t1 = new Thread(task);Thread t2 = new Thread(task);t1.start();t2.start();t1.join();t2.join();System.out.println("Final counter value: " + counter); // 应该输出20000}
}
http://www.xdnf.cn/news/10227.html

相关文章:

  • 【数据集】全球无缝高分辨率1 km 月均地表温度和气温(2001-2020)
  • 小白的进阶之路系列之八----人工智能从初步到精通pytorch综合运用的讲解第一部分
  • 【C++】 类和对象(上)
  • Matlab数据类型
  • 界面形成能的理解
  • Python简易音乐播放器开发教程
  • day61—DFS—省份数量(LeetCode-547)
  • 【计算机网络】 ARP协议和DNS协议
  • 38.springboot使用rabbitmq
  • qwen 2.5 并行计算机制:依靠 PyTorch 和 Transformers 库的分布式能力
  • GB 36246-2018 中小学合成材料面层运动场地检测
  • 【七. Java字符串操作与StringBuilder高效拼接技巧】
  • 新闻数据加载(鸿蒙App开发实战)
  • 飞致云开源社区月度动态报告(2025年5月)
  • uniapp 键盘顶起页面问题
  • G25-05-31Rust开源项目日报 Top10
  • C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件
  • Ubuntu搭建DNS服务器
  • python:PyMOL 能处理 *.pdb 文件吗?
  • 俄军操作系统 Astra Linux 安装教程
  • 机器学习:欠拟合、过拟合、正则化
  • Android15 userdebug版本不能remount
  • reverse_ssh 建立反向 SSH 连接指南 混淆AV [好东西哟]
  • 腾讯云推出云开发AI Toolkit,国内首个面向智能编程的后端服务
  • Vue 3 中ref 结合ts 获取 DOM 元素的实践指南。
  • BLE 广播与扫描机制详解:如何让设备“被看见”?
  • Deseq2:MAG相对丰度差异检验
  • 算法分析与设计概述
  • 达梦的TEMP_SPACE_LIMIT参数
  • 如何实现一个请求库?【面试场景题】