161207、高并发:java.util.concurrent.Semaphore实现字符串池及其常用方法介绍
- 实现字符串池:
- StrPool.java
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.Semaphore;
- import java.util.concurrent.locks.Condition;
- import java.util.concurrent.locks.ReentrantLock;
- public class StrPool {
- private int poolMaxSize = 5;//pool的最大值
- private int semaphorePermits = 5;//semaphore的允许数
- private List<String> list = new ArrayList<String>();
- private Semaphore concurrencySemaphore = new Semaphore(semaphorePermits);
- private ReentrantLock lock = new ReentrantLock();
- private Condition condition = lock.newCondition();
- public StrPool() {
- super();
- for (int i = 0; i < poolMaxSize; i++) {
- list.add("字符串" + (i + 1));
- }
- }
- public String get() {
- String getString = null;
- try {
- concurrencySemaphore.acquire();
- lock.lock();
- while (list.size() == 0) {
- condition.await();
- }
- getString = list.remove(0);
- lock.unlock();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return getString;
- }
- public void put(String stringValue) {
- lock.lock();
- list.add(stringValue);
- condition.signalAll();
- lock.unlock();
- concurrencySemaphore.release();
- }
- }
- TestThread.java
- public class TestThread extends Thread {
- private StrPool listPool;
- public TestThread(StrPool listPool) {
- super();
- this.listPool = listPool;
- }
- @Override
- public void run() {
- for (int i = 0; i < Integer.MAX_VALUE; i++) {
- String getStr = listPool.get();
- System.out.println(Thread.currentThread().getName() + " 取到的值:"
- + getStr);
- listPool.put(getStr);
- }
- }
- }
- Run.java
- public class Run {
- public static void main(String[] args) {
- /**
- * 字符串池,实际应用中可以改成数据库连接池等(自己定义)
- */
- StrPool pool = new StrPool();
- TestThread[] threadArray = new TestThread[12];
- for (int i = 0; i < threadArray.length; i++) {
- threadArray[i] = new TestThread(pool);
- }
- for (int i = 0; i < threadArray.length; i++) {
- threadArray[i].start();
- }
- }
- }
- 常用方法:
- 构造方法:
- Semaphore(int permits) 创建具有给定的许可数和非公平的公平设置的 Semaphore。
- Semaphore(int permits, boolean fair) 创建具有给定的许可数和给定的公平设置的 Semaphore。
- 方法:
- void acquire() 从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。
- void acquire(int permits) 从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,或者线程已被中断。
- void acquireUninterruptibly() 从此信号量中获取许可,在有可用的许可前将其阻塞。
- void acquireUninterruptibly(int permits) 从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。
- int availablePermits() 返回此信号量中当前可用的许可数。
- int drainPermits() 获取并返回立即可用的所有许可。//一般测试用
- protected Collection<Thread> getQueuedThreads() 返回一个 collection,包含可能等待获取的线程。
- int getQueueLength() 返回正在等待获取的线程的估计数目。
- boolean hasQueuedThreads() 查询是否有线程正在等待获取。
- boolean isFair() 如果此信号量的公平设置为 true,则返回 true。
- protected void reducePermits(int reduction) 根据指定的缩减量减小可用许可的数目。
- void release() 释放一个许可,将其返回给信号量。
- void release(int permits) 释放给定数目的许可,将其返回到信号量。
- String toString() 返回标识此信号量的字符串,以及信号量的状态。
- boolean tryAcquire() 仅在调用时此信号量存在一个可用许可,才从信号量获取许可。
- boolean tryAcquire(int permits) 仅在调用时此信号量中有给定数目的许可时,才从此信号量中获取这些许可。
- boolean tryAcquire(int permits, long timeout, TimeUnit unit) 如果在给定的等待时间内此信号量有可用的所有许可,并且当前线程未被中断,则从此信号量获取给定数目的许可。
- boolean tryAcquire(long timeout, TimeUnit unit) 如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被中断,则从此信号量获取一个许可。
161207、高并发:java.util.concurrent.Semaphore实现字符串池及其常用方法介绍的更多相关文章
- java.util.concurrent.Semaphore 使用
1. 概述 Semaphore(信号) 并不存在真正的许可 只是维护一个计数器, 通常用来限定进入一些资源的线程数 accquire() 方法获取许可 成功则计数器值-1 没有则阻塞直到一个可用的 ...
- Java并发—java.util.concurrent.locks包
一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当 ...
- Java并发—java.util.concurrent并发包概括(转载)
一.描述线程的类:Runable和Thread都属于java.lang包 二.内置锁synchronized属于jvm关键字,内置条件队列操作接口Object.wait()/notify()/noti ...
- 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore
前几篇分析了一下AQS的原理和实现.这篇拿Semaphore信号量做样例看看AQS实际是怎样使用的. Semaphore表示了一种能够同一时候有多个线程进入临界区的同步器,它维护了一个状态表示可用的票 ...
- Java 并发工具包 java.util.concurrent 用户指南
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- Java并发编程-并发工具包(java.util.concurrent)使用指南(全)
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- Java_并发工具包 java.util.concurrent 用户指南(转)
译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html.本 ...
- Java 并发工具包 java.util.concurrent 大全
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- 1. java.util.concurrent - Java 并发工具包
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
随机推荐
- 获取dom元素的宽度和高度
一.获取css的大小 1.第一种通过内联样式 var box = document.getElementById('box'); var w = box.style.width; var h = bo ...
- iOS:iOS开发非常全的三方库、插件等等
iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...
- HTML: 仿写一个财经类静态的网页
要求:仿写一个静态的网页,主要采用HTML+CSS+DIV的布局方式, 新建两个文件:demo.html.demo.css 图片素材:image.zip demo.html代码如下: <!doc ...
- 3d sphere opengl
http://stackoverflow.com/questions/5988686/creating-a-3d-sphere-in-opengl-using-visual-c
- 01 viewport
<meta name="viewport" content="width=device-width,initial-scale=1.0">
- SQLdiag-配置文件-扩展
CustomDiagnostics在我们第一次双击D:\Program Files\Microsoft SQL Server\100\Tools\Binn目录下的SQLdiag.exe应用程序所收集的 ...
- 【推荐】使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之一 员工管理源码分享 在开始讲解之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery的U ...
- Hadoop2.2.0 第一步完成MapReduce wordcount计算文本数量
1.完成Hadoop2.2.0单机版环境搭建之后需要利用一个例子程序来检验hadoop2 的mapreduce的功能 //启动hdfs和yarn sbin/start-dfs.sh sbin/star ...
- configs for postgresql restart and postgresql reload
-- configs requiring postgresql restart select name, setting, context from pg_settings where context ...
- PostgreSQL Replication之第十二章 与Postgres-XC一起工作(2)
12.2安装 Postgres-XC 可以从 http://postgres-xc.sourceforge.net/下载Postgres-XC.对于本书,我们使用1.0.3版本的Postgres-XC ...