package org.vic.queue.core; import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * * @author Vic Chu * * @param <T> */ public class Queue<T> { public Queue(int size){ this.size = size; } private int size = 10; private final ReentrantLock lock = new ReentrantLock(); private final Condition notEmpty = lock.newCondition(); //非空 private final Condition notFull = lock.newCondition(); //非满 private Long take_waittingMillis = 0L; private Long put_warttingMillis = 0L; private LinkedList<T> queue = new LinkedList<T>(); public void put(T t) throws InterruptedException{ lock.lock(); try{ if(queue.size()>=size){ //不能放入,线程阻塞 System.out.println("当前队列 已满,无法加入新的数据。"); notFull.await(); //非满状态 线程阻塞(已经满了) }else{ //放入 notEmpty.signal(); //非空状态 线程阻塞(没有放满) System.out.println("队列处于非满状态,可以放入数据"); Thread.sleep(this.put_warttingMillis); queue.add(t); System.out.println("数据成功被放入队列中..."); } }finally{ lock.unlock(); } } public T take() throws InterruptedException{ lock.lock(); try{ if(queue.size()==0){ //线程阻塞 System.out.println("队列中无数据..."); notEmpty.await(); return null; }else{ //唤醒线程 notFull.signal(); Thread.sleep(this.take_waittingMillis); T t = queue.getFirst(); queue.removeFirst(); System.out.println("线程唤醒,成功获取到数据"); return t; } }finally{ lock.unlock(); } } public int queueLength(){ return queue.size(); } public void take_waittingMills(Long val){ this.take_waittingMillis = val; } public void put_waittingMills(Long val){ this.put_warttingMillis = val; } }
相关推荐
AQS是Java并发包中的抽象队列同步器,它是ReentrantLock、Semaphore等并发工具的基础,通过维护一个FIFO等待队列来管理线程的等待和唤醒。 9. **CAS(Compare and Swap)**: CAS是一种无锁算法,用于更新变量。...
AQS的源码阅读笔记详细介绍了ReentrantLock的实现机制,包括锁的释放和加锁过程、公平锁和非公平锁的实现、队列的管理机制等。通过阅读这些代码,可以更好地理解Java并发编程的机制和实现原理。
"哔哩哔哩JUC狂老师笔记.zip"中的笔记内容,显然聚焦于讲解如何有效地利用JUC库来提升并发性能和程序的正确性。下面,我们将深入探讨JUC中的关键知识点。 1. **锁机制**: - **synchronized**:Java内置的关键字,...
CAS 是一种基于硬件级别的指令实现的同步原语,用于.compareAndSwap,是 Java 并发包 java.utile.concurrent 中许多同步类的基础。CAS 的工作原理是首先检查要操作的变量是否是期望的值,如果是,则进行操作,否则不...
JUC 包中的同步类基本都是基于 AQS 同步器来实现的,如 ReentrantLock,Semaphore 等。 二、原理 1、AQS 工作机制: 如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为...
### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...
【笔记-4、显式锁和AQS1】 在Java并发编程中,显式锁(Lock)和隐式锁(synchronized)是两种常见的锁机制,它们提供了对共享资源的互斥访问。显式锁通过Java的Lock接口实现,而隐式锁主要依赖于synchronized关键字...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
5. AQS(AbstractQueuedSynchronizer):AQS是一个抽象的队列同步器,它是Lock接口实现的基础,包括ReentrantLock、ReentrantReadWriteLock等。AQS维护了一个FIFO等待队列,通过state字段来管理锁的状态。 6. ...
3. `Lock`接口及实现:Java并发库中的`Lock`接口提供了比`synchronized`更细粒度的锁控制,如`ReentrantLock`可重入锁、`ReadWriteLock`读写锁等。 四、并发工具类 1. `BlockingQueue`:阻塞队列常用于生产者-消费...
它使用FIFO(先进先出)队列结构,即`Node`类实现的同步队列和条件队列。 AQS的设计允许子类通过继承并实现其特定的同步行为。主要的方法包括`acquire`和`release`,用于获取和释放同步状态。AQS支持两种模式:独占...
synchronized是基于JVM实现的,而Lock是基于API层面的。除了这两种基本的锁类型,Java还提供了诸如ReentrantLock、ReadWriteLock等高级锁的实现。 最后,为了实现高并发,还需要掌握一些常用的并发工具和设计模式,...
在Java 7之前,ConcurrentHashMap主要依赖于Segment上的ReentrantLock来实现同步。每个Segment都有一个内部锁,当进行写操作时,会锁定对应Segment,读操作则不需要锁定。而从Java 8开始,ConcurrentHashMap改用CAS...
这种模式通常借助于BlockingQueue(阻塞队列)来实现,生产者将数据放入队列,消费者从队列中取出数据,队列满时生产者会阻塞,队列空时消费者会阻塞。 在Java中,线程有六种状态:NEW、RUNNABLE、BLOCKED、WAITING...
"JUC并发编程学习笔记(硅谷)"很可能包含了关于Java并发工具集(Java Util Concurrency, JUC)的深入理解和实战经验。JUC是Java标准库提供的一套强大的并发处理工具,它极大地简化了多线程编程,提高了程序的可读性...
### Java课堂笔记精要 #### 第一章 SQL Server 基本操作 ##### SQL Server 操作须知 1. **安装路径**: 安装文件及其安装路径都不能包含中文字符,否则可能会导致安装失败或出现其他错误。 2. **版本有效期**: 如果...
13. **ReentrantLock的实现**:基于AQS(AbstractQueuedSynchronizer),使用CLH锁(自旋锁)维护一个双向队列,线程通过不断轮询前一个节点状态等待锁的释放。 14. **RDB快照**:Redis使用bgSAVE命令创建子进程...
10. **原子类**:`java.util.concurrent.atomic`包下的原子类如`AtomicInteger`、`AtomicLong`等,提供了基于CAS(Compare and Swap)的无锁操作,用于在多线程环境下实现高效且线程安全的操作。 11. **Future和...
AQS维护了一个整型的同步状态(state)和一个FIFO的等待队列(基于CLH队列)。线程通过CAS操作尝试改变状态,当资源被占用时,未成功获取资源的线程会被构造成Node节点加入队列等待。AQS通过公平或非公平策略,以及...