首页 > 其他分享 >信号量Semaphore

信号量Semaphore

时间:2022-11-09 14:44:26浏览次数:37  
标签:PV 信号量 获取 线程 Semaphore new

一、Semaphore是什么?

Semaphore,俗称信号量,它是操作系统中PV操作的原语在java中实现。

基于AbstractQueuedSynchronizer实现!

Semaphore的功能非常强大,大小为1的信号量就类似于互斥锁,通过同时只能有一个线程获取信号量来实现。

大小为n(n>0)的信号量可以实现限流的功能,它可以实现只能有n个线程同时获取信号量。

 

二、PV操作是什么?

PV操作是操作系统一种实现进程互斥与同步的有效方法。

PV操作与信号量(S)的处理有关,P表示通过的意思,V表示释放的意思

用PV操作来管理共享资源时,首先要确保PV操作自身执行的正确性。

 

P操作的主要动作:

S减1;

若S减1后仍大于或等于0,则进程继续执行;

若S减1后小于0,则该进程被阻塞后放入等待该信号量的等待队列中。

 

V操作的主要动作:

S加1;

若相加后结果大于0,则进程继续执行;

若相加后结果小于或等于0,则从该信号量等待队列中释放一个等待进程。

 

三、Semaphore的使用场景

可以用于做流量控制,特别是公用资源有限的应用场景!

 

四、Semaphore的使用方式

Sempahore常用方法说明

1. acquire()
获取一个信号量资源,在获取到信号量资源前或者被其他线程调用中断之前线程一直处于阻塞状态.
2. acquire(int permits)
与acquire()方法不同的是,获取permits个信号量.
3. acquireUninterruptibly()
获取一个信号量资源,在获取到信号量资源之前线程一直处于阻塞状态(忽略中断).
4. tryAcquire()
尝试获取信号量资源,返回获取信号量成功或者失败,不阻塞线程.
5. availablePermits()
返回可用的信号量数量
6. release() 
释放信号量资源,唤醒一个获取信号量不成功的阻塞线程.
7. hasQueuedThreads()
等待队列里是否还存在等待线程.
8. getQueueLength()
获取等待队列里阻塞的线程数.
9. drainPermits()
清空信号量把可用信号量数量置为0,返回清空的信号量数量

 

Sempahore使用示例

以停车为示例:

代码中 new Semaphore(10)表示10个停车位

package com.chenly.semaphore;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 信号量
 * @author: chenly
 * @date: 2022-11-08 15:52
 * @description:
 * @version: 1.0
 */
public class Park {

    static Semaphore s = new Semaphore(10);
    private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  
    public static void main(String[] args) {
        for(int i = 0; i < 100; i++) {
            new Thread(() -> {
                try {
                    if(s.availablePermits()==0){
                        System.out.println(FORMATTER.format(new Date())+":"+Thread.currentThread().getName() + "车位不足");
                    }
                    System.out.println(FORMATTER.format(new Date())+":"+Thread.currentThread().getName() + "等待入停车库");
                    s.acquire();
                    int i1 = new Random().nextInt(10);

                    System.out.println(FORMATTER.format(new Date())+":"+Thread.currentThread().getName() + "停" + i1 + "秒" );
                    TimeUnit.SECONDS.sleep(i1);
                    System.out.println(FORMATTER.format(new Date())+":"+Thread.currentThread().getName() + "停车完毕,出停车库");
                    s.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }, i+"号车").start();
        }
    }
}

 

标签:PV,信号量,获取,线程,Semaphore,new
From: https://www.cnblogs.com/kiko2014551511/p/16873131.html

相关文章

  • 多线程同步之信号量
    对于多线程程序来说,同步是指在一定的时间内只允许某一个线程访问某个资源。而在此时间内,不允许其他的线程访问该资源。同步资源的方式:互斥锁、条件变量、读写锁、信号......
  • C# 多线程访问之 SemaphoreSlim(信号量)【C# 进阶】
    SemaphoreSlim是对可同时访问某一共享资源或资源池的线程数加以限制的Semaphore的轻量替代,也可在等待时间预计很短的情况下用于在单个进程内等待。由于SemaphoreSlim......
  • 并发工具之 Semaphore & CountDownLatch
    1.semaphore是什么?Semaphore字面意思是信号量的意思。它的作用是控制访问特定资源的线程数量,底层依赖AQS的状态state,是生产中比较常用的一个工具类。(基于共享模式)//......
  • CyclicBarrier、CountDownLatch、Semaphore的用法
    CyclicBarrier、CountDownLatch、Semaphore的用法CountDownLatch(线程计数器)CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有......
  • 信号量与互斥锁之间的区别
    (1):互斥量用于线程的互斥,信号线用于线程的同步。这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。(2):互斥量值只能为0/1,信号量值可以为非负整数。也就是说,一个互......
  • Java - Semaphore 与 Exchanger
    Semaphore 控制线程并发数量。内部维护一个等待队列,acquire使配额减1,release使配额加1。packageChapter01;importjava.util.concurrent.Semaphore;publicclass_01_Ru......
  • <semaphore.h> 和 <sys/sem.h> 的区别
    <sys/sem.h>为XSI(最初是UnixSystemV)信号量提供接口。这些不是基本POSIX标准的一部分(它们在XSI选项中,主要是为了传统的Unix兼容性),虽然它们还没有被认为是过时的/......
  • Semaphore
    1.介绍信号量为多线程协作提供了更为强大的控制方法。广义上说信号量是对锁的扩展,可以指定多个线程同时访问某一资源。2.构造方法publicSemaphore(intpermits){......
  • countDownLatch和Semaphore
     countDOwnLatch:当线程1调用await方法那么就会阻塞,线程2,线程3,线程4分别调用countDown方法,当线程4调用countDown方法那么阻塞的队列不管有多少个都会依此唤醒,并不会像AQS......
  • 《MiniPRO H750开发指南》第六十三章 UCOSII实验3-消息队列、信号量集和软件定时器
    第六十三章UCOSII实验3-消息队列、信号量集和软件定时器​上一章,我们学习了如何使用UCOSII的信号量和邮箱的使用,本章,我们将学习消息队列、信号量集和软件定时器的使用。​......