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; } }
相关推荐
ReentrantLock java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从...
java语言 并发编程 ReentrantLock与synchronized区别 详解
ReentrantLock的使用及注意事项
1、ReentrantLock简介 2、ReentrantLock函数列表 3、重入的实现 4、公平锁与非公平锁 5、ReentrantLock 扩展的功能 6
ReentrantLock源码剖析
一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个...
这份资源旨在详细讲解 Java 中的 Locks 框架,特别关注 ReentrantLock 的使用和原理。Locks 框架提供了比传统的 synchronized 关键字更强大、更灵活的线程同步机制,而 ReentrantLock 是其中的一种重要实现。 Locks ...
近日,阅读jdk并发包源码分析整理笔记。
ReentrantLock 实现原理 1
ReentrantLock lock方法注释
1. ReentrantLock的介绍 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java...
助于理解的例子 博文链接:https://uule.iteye.com/blog/1488356
NULL 博文链接:https://patrick002.iteye.com/blog/2170391
ReentrantLock.java
可重入锁: 也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,...ReentrantLock 在Java也是一个基础的锁,ReentrantLock 实现Lock接口提供一系列的基础函数,开发人员可以灵活的是应用函数满足各种复杂多变应用场景;
什么是公平锁和非公平锁 公平与非公平的一个很本质的区别就是,是否遵守FIFO(也就是先来后到)。当有多个线程来申请锁的时候,是否先申请的线程先获取锁,后申请的线程后获取锁?如果是的,则是 公平锁 ,否则是...
Java多线程ReentrantLock1
AQS和ReentrantLock.pdf
使用ReentrantLock和Lambda表达式让同步更纯净Java开发Java经验技巧共5页.pdf.zip