`
wx1568908808
  • 浏览: 31443 次
文章分类
社区版块
存档分类
最新评论

Semaphore信号量的学习笔记

 
阅读更多

       我们知道独占锁可以实现临界资源一次只能被一个线程访问,但如果想实现多个线程同时访问的话就要用到信号量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

分享到:
评论

相关推荐

    学习笔记信号量和进程间通信

    本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...

    分布式锁与信号量-2023C-m开发笔记

    这可能包括使用特定库或框架(如Redis的`redlock`实现或ZooKeeper的API)来创建和管理分布式锁,以及使用类似`semaphore`的数据结构实现分布式信号量。 总的来说,分布式锁和信号量是解决分布式系统中并发控制的...

    FreeRTos学习笔记

    ### FreeRTOS 学习笔记:深入理解多任务调度与信号量使用 #### 一、FreeRTOS 多任务调度原理 FreeRTOS(Free Real Time Operating System)是一款免费且开源的实时操作系统,广泛应用于嵌入式系统中。其核心功能之...

    JAVA 多线程学习笔记

    3. `Semaphore`:信号量,控制同时访问特定资源的线程数量。 4. `FutureTask`:表示一个异步计算的结果,可以检查计算是否完成,获取结果,甚至取消计算。 通过深入学习和实践这些知识点,我们可以更好地理解和...

    ucosii内核学习笔记.zip

    此外,UCOSII还包括信号量(Semaphore)、互斥信号量(Mutex)和内存管理等功能。信号量用于资源的共享和保护,互斥信号量则保证了对共享资源的独占访问。内存管理则负责动态分配和释放内存,避免内存泄漏,提高系统...

    Python信号与槽、多线程、类学习笔记.pdf

    Python提供了多种同步机制,例如锁(Lock)、信号量(Semaphore)、事件(Event)等,可以用来控制线程间的协作与数据的同步访问。 最后是关于类的学习。Python是一种面向对象的编程语言,类是面向对象编程的基础。...

    STM32 FreeRTOS 学习笔记,库函数总结,带目录

    4. **同步机制**:信号量(Semaphore)用于控制对共享资源的访问,互斥锁(Mutex)确保同一时间只有一个任务可以访问资源。例如,`xSemaphoreTake()`和`xSemaphoreGive()`用于获取和释放信号量。 5. **通信机制**:...

    自己整理的freertos、以太网学习笔记

    1. 信号量(Semaphore):用于控制对共享资源的访问,分为二进制信号量和计数信号量。 2. 互斥量(Mutex):用于保护临界区,确保同一时刻只有一个任务访问特定资源。 3. 事件标志组(Event Group):允许组合多个...

    JAVA并发编程实践-构建执行程序块-学习笔记

    Semaphore计数信号量是指在多线程环境下,使用Semaphore来实现线程安全的计数信号量。例如,在桌⾯搜索时,使用Semaphore来实现线程安全的计数信号量,以避免出现死锁、竞态条件等问题。 Barrier栅栏是指在多线程...

    【学习笔记】JUC基础基础程序

    Java并发包中的Semaphore(信号量)和LockSupport工具类也常用于线程同步。Semaphore可以限制同时访问特定资源的线程数量,而LockSupport提供底层的线程阻塞和唤醒功能,更底层且灵活性更高。 CountDownLatch和...

    Java线程编程学习笔记(二)

    这些示例可能涵盖了各种场景,如生产者消费者模型、线程间的协作(通过信号量Semaphore)、线程优先级、守护线程(daemon threads)以及线程中断的处理。通过分析这些示例,我们可以更好地理解Java线程在实际开发中...

    并发编程之一 日常学习笔记

    此外,还有更高级的并发工具,如Semaphore信号量、CountDownLatch倒计时器和CyclicBarrier同步屏障,它们能帮助我们更好地控制线程间的交互。 线程安全是并发编程中的核心问题。Java提供了多种保证线程安全的方式,...

    C#,UML ,sql学习笔记

    线程间的通信和同步是多线程编程的关键,可以通过锁(Mutex, Semaphore, Monitor)、信号量(ManualResetEvent, AutoResetEvent)以及异步等待等方式实现,以避免竞态条件和死锁问题。 【SQL优化】 SQL(Structured...

    Linux系统编程学习笔记

    ### Linux系统编程学习笔记 #### 一、IO **1.1 标准I/O (stdio)** - **fopen/fclose**: `fopen` 用于打开或创建一个文件,并返回一个指向该文件的 `FILE *` 类型的指针。`fclose` 用于关闭一个已经打开的文件。...

    JUC学习笔记(Java多线程)

    JUC还引入了`Semaphore`信号量,用于限制同时访问特定资源的线程数量,常用于限流和资源池管理。`CountDownLatch`和`CyclicBarrier`则是协调多个线程同步的工具,前者用于一次性阻塞等待,后者则允许线程反复使用,...

    JUC并发编程学习笔记(硅谷)

    - `Semaphore`:信号量,用于限制同时访问特定资源的线程数量。 5. **Future和ExecutorService** - `Future`接口:代表异步计算的结果,可以检查是否完成,获取结果或取消任务。 - `ExecutorService`:线程池...

    多线程学习笔记与学习

    多线程编程不仅涉及到线程的创建和管理,还包括线程同步和通信,例如互斥量(Mutex)、信号量(Semaphore)、事件(Event)和临界区(Critical Section)等同步机制,防止多个线程并发访问同一资源时产生的竞态条件...

    Posix多线程编程学习笔记

    ### Posix多线程编程学习笔记 #### 一、线程基础 ##### 1. 什么是线程? 在计算机程序中,线程是指一个进程中能够并发执行的基本单位。通俗地讲,线程就是一个进程内的多个执行路径。更精确地说,线程是“一个...

Global site tag (gtag.js) - Google Analytics