代码拉取完成,页面将自动刷新
同步操作将从 闲.大赋(李家智)/java-performance 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package com.ibeetl.code.ch03;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** Condition使用示例,参考
* https://blog.csdn.net/SEU_Calvin/article/details/70211712
* @author 公众号 java系统优化
* @param <T>
*/
public class MyArrayBlockingQueue<T> {
//维护的数据
private final T[] datas;
//数据的个数
private int count;
//插入取出的索引
private int putIndex;
private int takeIndex;
//锁
private final Lock lock = new ReentrantLock();
//定义两个条件,分别为“集合满”和“集合空”
private Condition full = lock.newCondition();
private Condition empty = lock.newCondition();
//提供MyArrayBlockingQueue的构造方法,初始化T[]数据
public MyArrayBlockingQueue() {
this(10);
}
public MyArrayBlockingQueue(int maxSize) {
this.datas = (T[]) new Object[maxSize];
}
public void put(T data){
lock.lock();
try {
if(count == datas.length){
//此时集合已经满了
System.out.println("集合已满,请等待...");
//使调用线程挂起
full.await();
}
//不满则添加新元素
datas[putIndex++] = data;
count++;
//此时唤醒等待取数据的线程
empty.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
public T take(){
lock.lock();
try {
if(count == 0){
//此时集合已经空了
System.out.println("集合已空,请等待...");
//使调用线程挂起
empty.await();
}
//不空则取出最后一个数据
takeIndex = count - 1;
T result = datas[takeIndex--];
count--;
//此时唤醒等待写数据的线程
full.signalAll();
return result;
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
return null;
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。