`

AQS-预备-FIFOMutex

 
阅读更多

通过AtomicBoolean 和队列实现一个线程FIFO的Lock工具,

一步步接近AQS!!!

 

package com.horizon.thread.aqs;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.LockSupport;

public class FIFOMutex {
	private final AtomicBoolean locked = new AtomicBoolean(false);
	/**
	 * 线程先进先出队列
	 */
	private final Queue<Thread> waiters = new ConcurrentLinkedQueue<Thread>();

	public void lock() {
		boolean wasInterrupted = false;
		Thread current = Thread.currentThread();
		//把当前线程加入队列
		waiters.add(current);

		// Block while not first in queue or cannot acquire lock
		//如果当前线程不是第一个:不是第一个肯定,肯定有其他线程在持有资源(保证公平性)
		//即使是第一个:加锁失败,即使是第一个线程,如果上一个线程没有释放锁 ,那么也应该进入等待
		while (waiters.peek() != current || !locked.compareAndSet(false, true)) {
			LockSupport.park(this);
			if (Thread.interrupted()) // ignore interrupts while waiting
				wasInterrupted = true;
		}

		//可以把第一个线程移除了,因为已经占用了资源
		waiters.remove();
		if (wasInterrupted) // reassert interrupt status on exit
			current.interrupt();
	}

	public void unlock() {
		//释放锁,其他的线程 此时也不能占用资源
		locked.set(false);
		
		//此时线程才可以真正执行
		LockSupport.unpark(waiters.peek());
	}

}

 

分享到:
评论

相关推荐

    AQS-3抽象队列同步器

    AQS_3抽象队列同步器

    aqs-并发编程笔记.pdf

    并发编程笔记中的知识点涵盖了保护性暂停模式(Guarded Suspension Design Pattern)的定义、实现与分析,以及在Java中如何通过GuardedObject对象来实现多线程间的结果传递和超时处理。以下是详细的知识点梳理: ...

    20.9.24aqs-并发编程笔记.pdf

    保护性暂停模式(Guarded Suspension Design Pattern)是一种在多线程环境下实现线程之间安全地传递信息的模式。这种模式主要解决了在并发编程中如何安全高效地进行线程间通信和数据传递的问题。...

    aqs-并发编程(2)笔记.pdf

    在并发编程中,保护性暂停模式(Guarded Suspension Design Pattern)是一种常用的同步机制,用于线程间的协作。该模式允许一个线程等待另一个线程的特定操作完成,然后继续执行。在该模式中,线程间共享的某个对象...

    aqs-backend

    标题 "aqs-backend" 暗示我们正在讨论一个基于Spring Boot的后端项目,它使用了Spring Data MongoDB模块来处理MongoDB数据库操作。这个项目可能是为了构建一个应用程序的后端服务,提供RESTful API接口,以便前端或...

    aqs中文翻译-by sushengmiyan.pdf

    java大师doug lean 在JDK1.5版本的AQS论文中文翻译。 许可:本作品的全部或部分在不为牟利或商业利益为目的的,且在第一页引述本声明及全完整引用的前提下,以数码或硬拷贝形式供个人或课堂使用的复制或分发不收取...

    aqs_demo.rar

    《AQS同步器与Redisson锁在Java高并发API及SpringBoot中的应用》 在Java并发编程领域,AbstractQueuedSynchronizer(AQS)是一个非常重要的基础组件,它是Java并发包java.util.concurrent中实现锁和同步器的核心...

    TAC软件、产品、部分外围设备技术资料目录.pdf

    TAC-AQS-R和DB-AQS-D可能是空气质量管理解决方案中的两个组件或模块。它们可能负责空气质量监测和控制,确保室内环境满足特定的舒适度和健康标准。技术资料页码为137-138,这意味着我们可能需要查找这部分内容来获取...

    Java并发之AQS详解.pdf

    Java并发之AQS详解 AbstractQueuedSynchronizer(AQS)是 Java 并发编程中的一个核心组件,提供了一套多线程访问共享资源的同步器框架。AQS 定义了两种资源共享方式:Exclusive(独占)和 Share(共享)。在 AQS 中...

    JDK_AQS解析

    ### JDK_AQS解析 #### 概述 在Java并发编程中,`AbstractQueuedSynchronizer`(简称AQS)是实现锁和其他同步工具的基础框架。AQS位于`java.util.concurrent`包下,通过模板方法设计模式实现了锁的底层机制。本文将...

    AQS源码分析 (1).pdf

    AQS全称为AbstractQueuedSynchronizer,是java中用于构建锁以及其他同步器的一个框架。在多线程的编程中,同步问题是一个非常重要的问题,而AQS正是为了解决这个问题而生的。 首先,我们需要了解的是AQS的核心思想...

    joeylv#joscrapy#【Java并发编程实战】-----AQS(四):CLH同步队列1

    在线程获取锁时会调用AQS的acquire()方法,该方法第一次尝试获取锁如果失败,会将该线程加入到CLH队列中:public final void acqui

    【并发编程】简单化理解AQS和ReentrantLock.pdf

    AQS和`ReentrantLock`是Java并发编程中重要的组成部分,通过对它们的理解和掌握,可以更好地设计和实现高性能的并发程序。通过本文的学习,读者可以了解到这些核心概念和技术的实际应用,并能够根据具体的业务需求...

    AQS流程图.html

    java锁AQS基础逻辑

    java并发编程-AQS和JUC实战

    ### Java并发编程-AQS和JUC实战 #### 一、ReentrantLock 重入锁 **1.1 概述** - **基本介绍**: `ReentrantLock` 是一个实现了 `Lock` 接口的可重入互斥锁,提供比 `synchronized` 更丰富的功能。与 `synchronized...

Global site tag (gtag.js) - Google Analytics