`
vortexchoo
  • 浏览: 66866 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

基于ReentrantLock 队列笔记

    博客分类:
  • java
阅读更多
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;
    }
    
    
}

 

分享到:
评论

相关推荐

    Java并发编程学习笔记

    AQS是Java并发包中的抽象队列同步器,它是ReentrantLock、Semaphore等并发工具的基础,通过维护一个FIFO等待队列来管理线程的等待和唤醒。 9. **CAS(Compare and Swap)**: CAS是一种无锁算法,用于更新变量。...

    AQS源码阅读笔记,画了两三天的AQS...

    AQS的源码阅读笔记详细介绍了ReentrantLock的实现机制,包括锁的释放和加锁过程、公平锁和非公平锁的实现、队列的管理机制等。通过阅读这些代码,可以更好地理解Java并发编程的机制和实现原理。

    哔哩哔哩JUC狂老师笔记.zip

    "哔哩哔哩JUC狂老师笔记.zip"中的笔记内容,显然聚焦于讲解如何有效地利用JUC库来提升并发性能和程序的正确性。下面,我们将深入探讨JUC中的关键知识点。 1. **锁机制**: - **synchronized**:Java内置的关键字,...

    Thread基础知识点笔记总结

    CAS 是一种基于硬件级别的指令实现的同步原语,用于.compareAndSwap,是 Java 并发包 java.utile.concurrent 中许多同步类的基础。CAS 的工作原理是首先检查要操作的变量是否是期望的值,如果是,则进行操作,否则不...

    并发锁核心类AQS学习笔记

    JUC 包中的同步类基本都是基于 AQS 同步器来实现的,如 ReentrantLock,Semaphore 等。 二、原理 1、AQS 工作机制: 如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为...

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    ### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...

    笔记-4、显式锁和AQS1

    【笔记-4、显式锁和AQS1】 在Java并发编程中,显式锁(Lock)和隐式锁(synchronized)是两种常见的锁机制,它们提供了对共享资源的互斥访问。显式锁通过Java的Lock接口实现,而隐式锁主要依赖于synchronized关键字...

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

    Java多线程源码笔记.pdf

    5. AQS(AbstractQueuedSynchronizer):AQS是一个抽象的队列同步器,它是Lock接口实现的基础,包括ReentrantLock、ReentrantReadWriteLock等。AQS维护了一个FIFO等待队列,通过state字段来管理锁的状态。 6. ...

    并发编程笔记+包含所有

    3. `Lock`接口及实现:Java并发库中的`Lock`接口提供了比`synchronized`更细粒度的锁控制,如`ReentrantLock`可重入锁、`ReadWriteLock`读写锁等。 四、并发工具类 1. `BlockingQueue`:阻塞队列常用于生产者-消费...

    java中的并发变成学习笔记2

    它使用FIFO(先进先出)队列结构,即`Node`类实现的同步队列和条件队列。 AQS的设计允许子类通过继承并实现其特定的同步行为。主要的方法包括`acquire`和`release`,用于获取和释放同步状态。AQS支持两种模式:独占...

    Java并发编程与高并发解决方案-学习笔记.pdf

    synchronized是基于JVM实现的,而Lock是基于API层面的。除了这两种基本的锁类型,Java还提供了诸如ReentrantLock、ReadWriteLock等高级锁的实现。 最后,为了实现高并发,还需要掌握一些常用的并发工具和设计模式,...

    Java并发编程笔记之ConcurrentHashMap原理探究.docx

    在Java 7之前,ConcurrentHashMap主要依赖于Segment上的ReentrantLock来实现同步。每个Segment都有一个内部锁,当进行写操作时,会锁定对应Segment,读操作则不需要锁定。而从Java 8开始,ConcurrentHashMap改用CAS...

    多线程学习笔记.docx

    这种模式通常借助于BlockingQueue(阻塞队列)来实现,生产者将数据放入队列,消费者从队列中取出数据,队列满时生产者会阻塞,队列空时消费者会阻塞。 在Java中,线程有六种状态:NEW、RUNNABLE、BLOCKED、WAITING...

    JUC并发编程学习笔记(硅谷)

    "JUC并发编程学习笔记(硅谷)"很可能包含了关于Java并发工具集(Java Util Concurrency, JUC)的深入理解和实战经验。JUC是Java标准库提供的一套强大的并发处理工具,它极大地简化了多线程编程,提高了程序的可读性...

    java课堂笔记_自己总结的

    ### Java课堂笔记精要 #### 第一章 SQL Server 基本操作 ##### SQL Server 操作须知 1. **安装路径**: 安装文件及其安装路径都不能包含中文字符,否则可能会导致安装失败或出现其他错误。 2. **版本有效期**: 如果...

    笔记2232 真的非常不错

    13. **ReentrantLock的实现**:基于AQS(AbstractQueuedSynchronizer),使用CLH锁(自旋锁)维护一个双向队列,线程通过不断轮询前一个节点状态等待锁的释放。 14. **RDB快照**:Redis使用bgSAVE命令创建子进程...

    尚硅谷大厂面试题第三季周阳主讲

    AQS维护了一个整型的同步状态(state)和一个FIFO的等待队列(基于CLH队列)。线程通过CAS操作尝试改变状态,当资源被占用时,未成功获取资源的线程会被构造成Node节点加入队列等待。AQS通过公平或非公平策略,以及...

    Java并发编程学习笔记.

    10. **原子类**:`java.util.concurrent.atomic`包下的原子类如`AtomicInteger`、`AtomicLong`等,提供了基于CAS(Compare and Swap)的无锁操作,用于在多线程环境下实现高效且线程安全的操作。 11. **Future和...

Global site tag (gtag.js) - Google Analytics