我们知道独占锁可以实现临界资源一次只能被一个线程访问,但如果想实现多个线程同时访问的话就要用到信号量Semaphore——记录一个共享资源被访问线程的个数,Semeahore更像是一个共享锁,当它的许可数为1的时候就相当于独占锁了;acquire(int n)拿许可,一次可拿多个、tryAcquire()尝试拿许可boolean,也可设置尝试获取时间、release()释放许可;
public class SamephoreDemo {
static Semaphore sema=new Semaphore(2);
public static class task implements Runnable{
@Override
public void run() {
try {
sema.acquire();//拿许可
Thread.sleep(2000);//模拟耗时
System.out.println(Thread.currentThread().getName()+"完成");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
sema.release();//释放许可
}
}
}
public static void main(String[] args) {
ExecutorService executorService=Executors.newFixedThreadPool(8);
for(int i=0;i<16;i++){
executorService.submit(new task());
}
}
}
执行结果:每隔2s左右打印2条信息
pool-1-thread-1完成
pool-1-thread-2完成
pool-1-thread-4完成
pool-1-thread-1完成
pool-1-thread-1完成
pool-1-thread-4完成
pool-1-thread-3完成
pool-1-thread-4完成
pool-1-thread-3完成
pool-1-thread-4完成
pool-1-thread-5完成
pool-1-thread-7完成
pool-1-thread-6完成
pool-1-thread-8完成
pool-1-thread-1完成
pool-1-thread-2完成
解析:我们定义了一个许可数为2的信号量,一次最多两个线程同时执行,故执行结果是每隔2s左右打印2条信息。
转载于:https://my.oschina.net/u/3734816/blog/3060083
分享到:
相关推荐
本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...
这可能包括使用特定库或框架(如Redis的`redlock`实现或ZooKeeper的API)来创建和管理分布式锁,以及使用类似`semaphore`的数据结构实现分布式信号量。 总的来说,分布式锁和信号量是解决分布式系统中并发控制的...
### FreeRTOS 学习笔记:深入理解多任务调度与信号量使用 #### 一、FreeRTOS 多任务调度原理 FreeRTOS(Free Real Time Operating System)是一款免费且开源的实时操作系统,广泛应用于嵌入式系统中。其核心功能之...
3. `Semaphore`:信号量,控制同时访问特定资源的线程数量。 4. `FutureTask`:表示一个异步计算的结果,可以检查计算是否完成,获取结果,甚至取消计算。 通过深入学习和实践这些知识点,我们可以更好地理解和...
此外,UCOSII还包括信号量(Semaphore)、互斥信号量(Mutex)和内存管理等功能。信号量用于资源的共享和保护,互斥信号量则保证了对共享资源的独占访问。内存管理则负责动态分配和释放内存,避免内存泄漏,提高系统...
Python提供了多种同步机制,例如锁(Lock)、信号量(Semaphore)、事件(Event)等,可以用来控制线程间的协作与数据的同步访问。 最后是关于类的学习。Python是一种面向对象的编程语言,类是面向对象编程的基础。...
4. **同步机制**:信号量(Semaphore)用于控制对共享资源的访问,互斥锁(Mutex)确保同一时间只有一个任务可以访问资源。例如,`xSemaphoreTake()`和`xSemaphoreGive()`用于获取和释放信号量。 5. **通信机制**:...
1. 信号量(Semaphore):用于控制对共享资源的访问,分为二进制信号量和计数信号量。 2. 互斥量(Mutex):用于保护临界区,确保同一时刻只有一个任务访问特定资源。 3. 事件标志组(Event Group):允许组合多个...
Semaphore计数信号量是指在多线程环境下,使用Semaphore来实现线程安全的计数信号量。例如,在桌⾯搜索时,使用Semaphore来实现线程安全的计数信号量,以避免出现死锁、竞态条件等问题。 Barrier栅栏是指在多线程...
Java并发包中的Semaphore(信号量)和LockSupport工具类也常用于线程同步。Semaphore可以限制同时访问特定资源的线程数量,而LockSupport提供底层的线程阻塞和唤醒功能,更底层且灵活性更高。 CountDownLatch和...
这些示例可能涵盖了各种场景,如生产者消费者模型、线程间的协作(通过信号量Semaphore)、线程优先级、守护线程(daemon threads)以及线程中断的处理。通过分析这些示例,我们可以更好地理解Java线程在实际开发中...
此外,还有更高级的并发工具,如Semaphore信号量、CountDownLatch倒计时器和CyclicBarrier同步屏障,它们能帮助我们更好地控制线程间的交互。 线程安全是并发编程中的核心问题。Java提供了多种保证线程安全的方式,...
线程间的通信和同步是多线程编程的关键,可以通过锁(Mutex, Semaphore, Monitor)、信号量(ManualResetEvent, AutoResetEvent)以及异步等待等方式实现,以避免竞态条件和死锁问题。 【SQL优化】 SQL(Structured...
### Linux系统编程学习笔记 #### 一、IO **1.1 标准I/O (stdio)** - **fopen/fclose**: `fopen` 用于打开或创建一个文件,并返回一个指向该文件的 `FILE *` 类型的指针。`fclose` 用于关闭一个已经打开的文件。...
JUC还引入了`Semaphore`信号量,用于限制同时访问特定资源的线程数量,常用于限流和资源池管理。`CountDownLatch`和`CyclicBarrier`则是协调多个线程同步的工具,前者用于一次性阻塞等待,后者则允许线程反复使用,...
- `Semaphore`:信号量,用于限制同时访问特定资源的线程数量。 5. **Future和ExecutorService** - `Future`接口:代表异步计算的结果,可以检查是否完成,获取结果或取消任务。 - `ExecutorService`:线程池...
多线程编程不仅涉及到线程的创建和管理,还包括线程同步和通信,例如互斥量(Mutex)、信号量(Semaphore)、事件(Event)和临界区(Critical Section)等同步机制,防止多个线程并发访问同一资源时产生的竞态条件...
### Posix多线程编程学习笔记 #### 一、线程基础 ##### 1. 什么是线程? 在计算机程序中,线程是指一个进程中能够并发执行的基本单位。通俗地讲,线程就是一个进程内的多个执行路径。更精确地说,线程是“一个...