- 浏览: 71503 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Alex_Cheung:
对了,第二个没有提取码,请知悉。
一大波视频分享 -
Alex_Cheung:
谢谢分享。
一大波视频分享 -
Jiy:
很详细,谢谢分享
java并发之同步辅助类Phaser -
walle1027:
非常不错,学习了。
java并发之同步辅助类Phaser -
huangjinjin520:
somefuture 写道除了单词写错了 其他挺好的已更正
dubbo注解使用详解
semaphore(seməˌfôr)含义:
信号量就是可以声明多把锁(包括一把锁:此时为互斥信号量)。
举个例子:一个房间如果只能容纳5个人,多出来的人必须在门外面等着。如何去做呢?一个解决办法就是:房间外面挂着五把钥匙,每进去一个人就取走一把钥匙,没有钥匙的不能进入该房间而是在外面等待。每出来一个人就把钥匙放回原处以方便别人再次进入。
常用方法
acquire():获取信号量,信号量内部计数器减1
release():释放信号量,信号量内部计数器加1
tryAcquire():这个方法试图获取信号量,如果能够获取返回true,否则返回false
信号量控制的线程数量在声明时确定。例如:
Semphore s = new Semphore(2);
一个例子
实现一个功能:一个打印队列,被三台打印机打印
package semaphore;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PrintQueue {
//信号量
private Semaphore semaphore;
//是否空闲打印机
private boolean freePrinters[];
private Lock lockPrinters;
public PrintQueue(){
//初始化三个信号
semaphore=new Semaphore(3);
//三台空闲打印机
freePrinters=new boolean[3];
for (int i=0; i<3; i++){
freePrinters[i]=true;
}
lockPrinters=new ReentrantLock();
}
public void printJob (Object document){
try {
//获取信号量
semaphore.acquire();
int assignedPrinter=getPrinter();
Long duration=(long)(Math.random()*10);
System.out.printf("%s: PrintQueue: Printing a Job in Printer %d during %d seconds\n",Thread.currentThread().getName(),assignedPrinter,duration);
TimeUnit.SECONDS.sleep(duration);
freePrinters[assignedPrinter]=true;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// Free the semaphore
semaphore.release();
}
}
private int getPrinter() {
int ret=-1;
try {
lockPrinters.lock();
for (int i=0; i<freePrinters.length; i++) {
if (freePrinters[i]){
ret=i;
freePrinters[i]=false;
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lockPrinters.unlock();
}
return ret;
}
}
声明一个Job类,使用打印队列:
package semaphore;
public class Job implements Runnable {
private PrintQueue printQueue;
public Job(PrintQueue printQueue){
this.printQueue=printQueue;
}
@Override
public void run() {
System.out.printf("%s: Going to print a job\n",Thread.currentThread().getName());
printQueue.printJob(new Object());
System.out.printf("%s: The document has been printed\n",Thread.currentThread().getName());
}
}
测试:
package semaphore;
public class MainCmd {
public static void main (String args[]){
PrintQueue printQueue=new PrintQueue();
//启动12个打印线程
Thread thread[]=new Thread[12];
for (int i=0; i<12; i++){
thread[i]=new Thread(new Job(printQueue),"Thread "+i);
}
for (int i=0; i<12; i++){
thread[i].start();
}
}
}
需要注意的地方
1、对于信号量声明的临界区,虽然可以控制线程访问的数量,但是不能保证代码块之间是线程安全的。所以上面的例子在方法printJob()方法里面使用了锁保证数据安全性。
2、信号量也涉及到公平性问题。和锁公平性一样,这里默认是非公平的。可以通过构造器显示声明锁的公平性。
public Semaphore(int permits, boolean fair)
应用场景
流量控制,即控制能够访问的最大线程数。
海量视频获取 vue视频 angular视频
信号量就是可以声明多把锁(包括一把锁:此时为互斥信号量)。
举个例子:一个房间如果只能容纳5个人,多出来的人必须在门外面等着。如何去做呢?一个解决办法就是:房间外面挂着五把钥匙,每进去一个人就取走一把钥匙,没有钥匙的不能进入该房间而是在外面等待。每出来一个人就把钥匙放回原处以方便别人再次进入。
常用方法
acquire():获取信号量,信号量内部计数器减1
release():释放信号量,信号量内部计数器加1
tryAcquire():这个方法试图获取信号量,如果能够获取返回true,否则返回false
信号量控制的线程数量在声明时确定。例如:
Semphore s = new Semphore(2);
一个例子
实现一个功能:一个打印队列,被三台打印机打印
package semaphore;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PrintQueue {
//信号量
private Semaphore semaphore;
//是否空闲打印机
private boolean freePrinters[];
private Lock lockPrinters;
public PrintQueue(){
//初始化三个信号
semaphore=new Semaphore(3);
//三台空闲打印机
freePrinters=new boolean[3];
for (int i=0; i<3; i++){
freePrinters[i]=true;
}
lockPrinters=new ReentrantLock();
}
public void printJob (Object document){
try {
//获取信号量
semaphore.acquire();
int assignedPrinter=getPrinter();
Long duration=(long)(Math.random()*10);
System.out.printf("%s: PrintQueue: Printing a Job in Printer %d during %d seconds\n",Thread.currentThread().getName(),assignedPrinter,duration);
TimeUnit.SECONDS.sleep(duration);
freePrinters[assignedPrinter]=true;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// Free the semaphore
semaphore.release();
}
}
private int getPrinter() {
int ret=-1;
try {
lockPrinters.lock();
for (int i=0; i<freePrinters.length; i++) {
if (freePrinters[i]){
ret=i;
freePrinters[i]=false;
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lockPrinters.unlock();
}
return ret;
}
}
声明一个Job类,使用打印队列:
package semaphore;
public class Job implements Runnable {
private PrintQueue printQueue;
public Job(PrintQueue printQueue){
this.printQueue=printQueue;
}
@Override
public void run() {
System.out.printf("%s: Going to print a job\n",Thread.currentThread().getName());
printQueue.printJob(new Object());
System.out.printf("%s: The document has been printed\n",Thread.currentThread().getName());
}
}
测试:
package semaphore;
public class MainCmd {
public static void main (String args[]){
PrintQueue printQueue=new PrintQueue();
//启动12个打印线程
Thread thread[]=new Thread[12];
for (int i=0; i<12; i++){
thread[i]=new Thread(new Job(printQueue),"Thread "+i);
}
for (int i=0; i<12; i++){
thread[i].start();
}
}
}
需要注意的地方
1、对于信号量声明的临界区,虽然可以控制线程访问的数量,但是不能保证代码块之间是线程安全的。所以上面的例子在方法printJob()方法里面使用了锁保证数据安全性。
2、信号量也涉及到公平性问题。和锁公平性一样,这里默认是非公平的。可以通过构造器显示声明锁的公平性。
public Semaphore(int permits, boolean fair)
应用场景
流量控制,即控制能够访问的最大线程数。
海量视频获取 vue视频 angular视频
发表评论
-
一大波视频分享
2018-06-09 09:36 11441.ps 链接: https://pan.baidu ... -
利用Sharding-Jdbc实现分表
2018-05-24 22:32 3790你们团队使用SpringMVC+Spr ... -
MINA原理详解
2018-05-19 13:51 14901. 通过SocketConnector同服务器端建立连接 ... -
最近有人说我欺骗消费者,今天来一波视频分享
2018-05-12 21:00 1256最近有人说我欺骗消费者,今天来一波视频分享 dubbo入门 ... -
SVN多版本库环境的搭建
2018-05-02 21:00 1216一、 1、启动SVN sudo svn ... -
前端 Java Python等资源合集大放送
2018-04-21 22:11 699如果需要学习视频,欢 ... -
Nginx会话保持之nginx-sticky-module模块
2018-04-16 20:34 1970在使用负载均衡的时候会遇到会话保持的问题,常用的方法有: 1. ... -
dubbo源码学习(四):暴露服务的过程
2018-04-14 11:38 981dubbo采用的nio异步的通信,通信协议默认为 netty, ... -
dubbo源码学习(四)初始化过程细节:解析服务
2018-04-12 20:32 618今天将真正去看dubbo内部的实现过程,看dubbo的源码前我 ... -
dubbo源码学习(二) : spring 自定义标签
2018-04-09 20:29 635做dubbo的配置时很容易发现,dubbo有一套自己的标签,提 ... -
Dubbo多注册中心和Zookeeper服务的迁移
2018-04-06 08:58 1506一、Dubbo多注册中心 1、 应用场景 例如阿里有些服务 ... -
dubbo源码学习一:基础知识及使用的相关技术
2018-04-05 20:10 691Dubbo是Alibaba开源的分布式服务框架,它最大的特点是 ... -
worker模式
2018-03-29 20:16 636今天来学学,大家也好对线程池有一个更好的理解。 public ... -
线程各种状态转移分析
2018-03-28 22:13 901线程在它的生命周期 ... -
生产者-消费者模式实现
2018-03-26 22:45 1161生产者是指:生产数据的线程 消费者是指:使用数据的线程 生产者 ... -
对find xargs grep和管道的深入理解
2018-03-24 22:14 768问题: 相信大家都知道在目录中搜索含有固定字符串文件的命令: ... -
java并发之同步辅助类Phaser
2018-03-19 21:46 1106Phaser含义: 更加复杂和强大的同步辅助类。它允许并发执 ... -
java并发之同步辅助类CyclicBarrier
2018-03-18 20:13 835CyclicBarrier含义: 栅栏允许两个或者多个线程在 ... -
MySQL常用命令
2018-03-13 22:09 7771、查看数据库状态 及 ... -
Tomcat 集群 文件上传下载的共享问题 NFS配置
2018-03-12 21:50 664Tomcat 集群时上传文件时如何使得多部tomcat中的文件 ...
相关推荐
Java并发工具包中包含了一些同步辅助类,如Semaphore(信号量)、CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)。它们帮助协调多线程间的协作,控制线程的并发访问数量或等待特定条件。 六、FutureTask...
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
在Java的并发编程中,Semaphore 是一个非常重要的同步辅助类,它用于控制对共享资源的访问。Semaphore 通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和潜在的性能问题。本文将详细介绍 ...
Java 并发工具类是 Java 并发编程的核心组件之一,提供了多种同步结构和并发容器,帮助开发者创建高效、可靠的并发程序。本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 ...
5. **CountDownLatch**:这个同步辅助类允许一个或多个线程等待其他线程完成操作。通常用于初始化阶段,主线程等待所有子线程完成后再继续执行。 6. **CyclicBarrier**:允许一组线程相互等待,直到所有线程都到达...
另外,`CountDownLatch`, `CyclicBarrier`, `Semaphore`等同步辅助类也是并发编程中常用的工具,它们有助于实现复杂的同步策略。 对于并发编程中的死锁、活锁和饥饿问题,书中给出了详细的分析和解决方案。读者还将...
本文将详细解析Java并发工具类,并通过示例代码介绍`CountDownLatch`、`CyclicBarrier`、`Phaser`、`Semaphore`和`ThreadLocal`的用法。 1. **CountDownLatch** `CountDownLatch`是一个计数器,通常用于等待多个...
1. **CyclicBarrier**:`CyclicBarrier`是一个同步辅助类,允许一组线程等待彼此到达一个公共屏障点。在所有线程都到达屏障后,屏障点被重置,然后线程可以继续执行。例如,`TestCyclicBarrier`和`TestCyclicBarrier...
CountDownLatch和CyclicBarrier是同步辅助类,用于协调多个线程的执行,而Semaphore用于控制对共享资源的访问数量。 此外,书中还会详细讨论锁和同步机制,如synchronized关键字、volatile变量、读写锁...
`CyclicBarrier`和`CountDownLatch`是两种重要的同步辅助类,前者用于一组线程等待彼此到达某个屏障点后一起继续执行,后者则用于一次性计数器,让一个或多个线程等待其他线程完成后再继续执行。 最后,`java.util....
在这个场景下,`MutiThreadTest.java` 文件可能是用于实现并发测试的代码,而 `GroboUtils-5-core.jar` 包可能包含了辅助进行并发测试或处理并发问题的工具类。 首先,我们需要理解Java并发的基础。Java提供了一...
- **CountDownLatch、CyclicBarrier和Semaphore**:这些同步辅助类在多线程协调中的应用,如计数器、栅栏和信号量。 - **Future和Callable**:描述了异步计算的实现,如何获取结果和取消任务。 5. **并发集合** ...
`CountDownLatch`是一个同步辅助类,用来等待一组操作的完成。它通常用于实现多个线程等待一个或多个事件的发生。 ```java CountDownLatch latch = new CountDownLatch(10); for (int i = 0; i ; i++) { new Thread...
- **CountDownLatch/CyclicBarrier/Semaphore**:这些同步辅助类在多线程协调中的应用。 4. **原子操作与CAS** - **Atomic包**:`AtomicInteger`、`AtomicReference`等原子类型及其无锁实现。 - **比较并交换...
`CountDownLatch`是一个同步辅助类,它允许一个或多个线程等待其他线程完成操作。通过调用`await()`方法,当前线程会等待,直到计数器的值减少到零。这通常用于实现多线程之间的同步等待机制。 ##### 3.3 ...
10. **CyclicBarrier**和**CountDownLatch**:这两个类是同步辅助工具,用于协调多个线程的执行。CyclicBarrier允许一组线程等待其他线程到达某个点后一起继续,CountDownLatch则让线程等待计数器归零后才能继续。 ...
- `CyclicBarrier`和`CountDownLatch`: 同步辅助类,允许一组线程等待其他线程到达某个点后继续执行。 - `Semaphore`:信号量,控制同时访问特定资源的线程数量。 4. **并发集合** - `ConcurrentHashMap`: 并发...
- **CountDownLatch**: 一个同步辅助类,用于控制主线程等待其他线程完成操作后继续执行。 - **CyclicBarrier**: 类似于`CountDownLatch`,但它可以复用,并且提供了一个回调函数来处理所有参与者到达屏障后的动作。...
它是一个一次性使用的同步辅助工具,可以通过`await()`方法阻塞当前线程,直到所有计数器减到0。 - **CyclicBarrier**:让一组线程在预定义的执行点进行等待,当所有线程到达这个点时,它们会被同时释放继续执行。 -...
在Android开发中,Java并发工具类库扮演着重要的角色,特别是在多线程和异步处理的场景下。这个名为“Xiaofei-it-Concurrent-Utils-829a450”的压缩包可能包含了一些优化和扩展了Java标准并发库(java.util....