Semaphore :一种可以控制访问资源的数量、或者控制同时同一操作的数量。
Semaphore构造器:
public Semaphore(int permits) 需要传入一个正整数,此数量即为控制访问的资源数量。
public Semaphore(int permits, boolean fair) 创建一个是否是公平的信号量。当fair=true
时,线程将会按到达的顺序(FIFO)执行。
下面是Semaphore的方法.
acquire() | 获取一个许可.当获取后对许可集减去1 |
acquire(int permits) | 获取permits个许可,当获取后对许可集减去permits |
release() | 释放一个许可 |
release(int permits) | 释放permits个许可 |
acquireUninterruptibly() | 一个不可中断的获取一个许可 |
acquireUninterruptibly(int permits) | 一个不可中断的获取permits个许可 |
tryAcquire() | 试图获取一个许可。如果获取到返回true,否则返回false |
tryAcquire(int permits) | 试图获取permits个许可。如果获取到返回true,否则返回false |
tryAcquire(long timeout, TimeUnit unit) | 单位时间内,试图获取一个许可。如果获取到返回true,否则返回false |
tryAcquire(int permits, long timeout, TimeUnit unit) | 单位时间内,试图获取permits个许可。如果获取到返回true,否则返回false |
|
下面举例说下用法:
1.控制访问数量
package com.asiainfo.concurrent;
import java.util.concurrent.Semaphore;
/**
* Semaphore 是控制资源的访问数量、或者同时执行同一操作的数量.
*
* 假设我们现在手上只有5台电脑,有10个人想上网。因此只能等有的人不上网了,其他人才有机会上网
* @author fansh
*
*/
public class SemaphoreTest {
/**
* 特定的资源 ---------只有5台电脑
*/
private static Semaphore semaphore = new Semaphore(5);
public static void main(String[] args) {
SemaphoreTest test = new SemaphoreTest();
for(int i=0;i<10;i++){
Person person = test.new Person(i+"");
person.start();
}
}
class Person extends Thread{
private String name;
public Person(String name){
this.name=name;
}
public void run() {
try {
semaphore.acquire();
System.out.println(this.name+"正在上网中.....");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
System.out.println(this.name+"不上网中.....");
semaphore.release();
}
}
}
}
2.使无界队列变为有界队列
package com.asiainfo.concurrent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
/**
* Semaphore
*
* 使无界队列变为有界队列
* @author fansh
*
*/
public class SemaphoreTest1<T> {
private final Semaphore semaphore;
private final List<T> list = new ArrayList<T>();
public SemaphoreTest1(int bound){
semaphore= new Semaphore(bound);
}
public void add(T t){
try {
semaphore.acquire();
list.add(t);
} catch (InterruptedException e) {
semaphore.release();
}
}
public void remove(T t){
boolean flag=list.remove(t);
if(flag){
semaphore.release();
}
}
}
3. 获取许可被中断 和不可中断的用法
package com.asiainfo.concurrent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.Semaphore;
/**
* Semaphore
* 模拟acquire阻塞时候被中断
* acquire 抛出InterruptedException 因此是可中断的
* acquireUninterruptibly 不可中断
*
* @author fansh
*
*/
public class SemaphoreTest2<T> {
private final Semaphore semaphore;
private final List<T> list = new ArrayList<T>();
public SemaphoreTest2(int bound){
semaphore= new Semaphore(bound);
}
public void add(T t){
// try {
// semaphore.acquire();
// list.add(t);
// } catch (InterruptedException e) {
// System.out.println("添加动作被中断了...........");
// semaphore.release();
// }
// 不可中断测试.....
semaphore.acquireUninterruptibly();
list.add(t);
}
public void remove(T t){
boolean flag=list.remove(t);
if(flag){
semaphore.release();
}
}
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
Future future=service.submit(new Runnable() {
@Override
public void run() {
SemaphoreTest2 test2 =new SemaphoreTest2(2);
test2.add("a");
test2.add("b");
test2.add("c");
}
});
service.shutdown();
/**
* 等待添加动作充分完成
*/
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
future.cancel(true);
}
}
分享到:
相关推荐
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...
Java中Semaphore(信号量)的使用方法 Semaphore(信号量)是一种非常重要的并发访问控制机制,它可以用来保护一个或者多个共享资源的访问。Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个...
信号量(Semaphore)是操作系统中一种重要的同步机制,它用于管理多个线程对共享资源的访问,以防止并发执行时产生竞态条件。在多线程编程中,当多个线程试图同时访问一个有限的资源时,信号量可以帮助我们协调这些...
在Java中,信号量由`java.util.concurrent.Semaphore`类实现,它提供了两种类型:可重用的二进制信号量和计数信号量。 1. **信号量的原理**: - 信号量是一个整数值,表示可用资源的数量。当线程需要使用资源时,...
// 从信号量中获取count个许可 sem.acquire(count); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + " acquire count=" + count); } catch (InterruptedException e) { e....
基于 Java 的并发信号量的计数信号量。 安装 通过 npm 安装模块: npm install async-semaphore 快速示例 // fairness false var Semaphore = require ( 'async-semaphore' ) ; var semaphore = new Semaphore ( ...
JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号...
在Java中,我们可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建一个信号量时,可以指定初始许可证的数量。以下是一个简单的示例: ```java import java.util.concurrent.Semaphore; public class ...
Java 信号量Semaphore是Java并发编程中的一种机制,用于控制多个线程的并发执行。Semaphore的实现主要是通过计数器来实现的,每个Semaphore对象都维护着一个计数器,用于记录当前可用的许可证数量。 在Java中,...
在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定资源的线程数量。 ### Semaphore简介 信号量...
Java中的Semaphore默认为可重用信号量,即允许多个线程同时获取许可,而二进制信号量则类似于一个锁,只允许一个线程持有许可。 **一、Semaphore的构造方法** 1. `Semaphore(int permits)`:创建一个具有指定初始...
在Java中,可以自定义一个名为`mySemaphore`的类来模拟信号量。这个类通常包含两个核心方法:`P()`(代表"PROCedure"或"Pass")和`V()`(代表"VERSus"或"Value increment")。`P()`方法用于尝试获取资源,如果资源不...
Semaphore Semaphore分为单值和多值两种,前者只能被一个线程获得,...单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场
Java编程中解决这个问题,通常会用到多线程和同步机制,如synchronized关键字或信号量。 在这个解决方案中,"图形界面"使得问题的展示更为直观,用户可以观察到哲学家们的行为和筷子的状态。重庆大学的学生可能会...
Semaphore 是Java并发编程中实现信号量机制的重要工具。它通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和潜在的性能问题。通过合理使用 Semaphore,可以有效地管理多线程对共享资源的访问...
例如,Java中的`java.util.concurrent.Semaphore`类提供了对信号量的操作,包括`acquire()`用于获取资源和`release()`用于释放资源。 了解并掌握信号量的概念和使用,对于处理并发问题至关重要。在面试中,能够详细...
在Java中,`java.util.concurrent.Semaphore`类提供了信号量功能。信号量有两个重要的参数: - 允许的许可证数量:表示可以并发访问的资源数量。 - 是否公平:若为true,按照请求顺序分配许可证;若为false(默认)...
在"semaphore控制多线程循序执行"的场景中,我们通常会用到计数信号量,它的核心作用是限制同时访问特定资源的线程数量。例如,如果我们要实现一个打印队列,让多个线程按顺序打印任务,Semaphore就可以用来保证打印...
在 Java 中,Semaphore(信号量)是一种非常有用的并发编程工具,主要用于控制访问某些资源的线程数目。下面,我们将详细介绍 Semaphore 的原理、实现和实例。 Semaphore 的原理 Semaphore 是一个计数器,用于限制...
6. **实际编程中的应用**:在Java中,可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建时指定初始值,然后在线程中调用`acquire()`(等价于P操作)和`release()`(等价于V操作)方法来管理资源访问。 ...