博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程练习之有界的缓存
阅读量:6488 次
发布时间:2019-06-24

本文共 2566 字,大约阅读时间需要 8 分钟。

1 package cn.sp.test; 2  3 import java.util.concurrent.Semaphore; 4  5 /** 6  * 有界的缓存 7  * @author pc 8  * 9  * @param 
10 */11 public class BoundedBuffer
{12 private final Semaphore availableItems;//可用项 信号量 13 private final Semaphore availableSpaces;//可用空间 信号量 14 private final E[] items;15 private int putPosition = 0,takePosition = 0;16 17 @SuppressWarnings("unchecked")18 public BoundedBuffer(int capacity){19 availableItems = new Semaphore(0);20 availableSpaces = new Semaphore(capacity);21 items = (E[]) new Object[capacity];22 }23 24 public boolean isEmpty(){
//可用许可为025 return availableItems.availablePermits() == 0;26 }27 28 public boolean isFull(){
//满时可用空间为029 return availableSpaces.availablePermits() == 0 ;30 }31 32 public void put(E x) throws InterruptedException{33 availableSpaces.acquire();34 doInsert(x);35 availableItems.release();36 }37 38 public E take() throws InterruptedException{39 availableItems.acquire();//从 availableItems 获取 一个许可40 E e = doExtract();41 availableSpaces.release();//返回 一个许可 到 availableSpaces42 return e;43 }44 45 private synchronized E doExtract() {46 int i = takePosition;47 E x = items[i];48 //取出后 调用垃圾收集器49 items[i] = null;50 takePosition = (++i == items.length)? 0 : i;51 return x;52 }53 54 private synchronized void doInsert(E x) {
//同步方法55 int i = putPosition;56 items[i] = x;57 //如果满了重置为058 putPosition = (++i == items.length) ? 0 :i;59 60 }61 }

测试类:

1 package cn.sp.test; 2  3 import org.junit.Assert; 4  5 public class Test { 6      7     public void test01(){ 8         BoundedBuffer
boundedBuffer = new BoundedBuffer
(10); 9 Assert.assertTrue(boundedBuffer.isEmpty());10 Assert.assertFalse(boundedBuffer.isFull());11 }12 @org.junit.Test13 public void test02() throws InterruptedException{14 BoundedBuffer
boundedBuffer = new BoundedBuffer
(10);15 16 for(int i=0;i<10;i++){17 boundedBuffer.put(i);18 }19 Assert.assertTrue(boundedBuffer.isFull());20 Assert.assertFalse(boundedBuffer.isEmpty());21 System.out.println(boundedBuffer.isFull());22 }23 }

 

转载于:https://www.cnblogs.com/2YSP/p/6929619.html

你可能感兴趣的文章
LeetCode - Subsets
查看>>
HDU 1425 sort 题解
查看>>
intellij idea使用
查看>>
可选链
查看>>
【Xamarin挖墙脚系列:典型的业务程序的结构搭建】
查看>>
Docker CPU 资源限制——CPU分片功能测试
查看>>
FP-Growth算法之频繁项集的挖掘(python)
查看>>
二叉树的非递归遍历
查看>>
基于Hibernate注解的解读
查看>>
ELK——安装 logstash 2.2.0、elasticsearch 2.2.0 和 Kibana 3.0
查看>>
Atitit.cateService分类管理新特性与设计文档说明v1
查看>>
Java内部DNS查询实现和参数设置
查看>>
MySQL批量SQL插入性能优化
查看>>
0c-37-ARC
查看>>
图像的 SNR 和 PSNR 的计算
查看>>
图像边缘检测——Sobel算子
查看>>
【并发编程】延时初始化
查看>>
Android用路径api在内部存储读写文件
查看>>
PHP 实现对象的持久层,数据库使用MySQL
查看>>
Freemarker生成静态代码实例
查看>>