Semaphore类浅析

news/2024/7/8 3:58:23 标签: semaphore

Semaphore

Semaphore,信号量。有时被称为信号灯,是在多线程环境下使用的一种设施,可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量,一旦该关键代码段完成了,那么该线程必须释放信号量,其他想进入该关键代码段的线程必须等待直到第一个线程释放信号量。

举例说明:

某广场有3个停车位,过来了6辆车,因此会有3辆车暂时没有车位,但是只要车位被空出来,这3辆车还是有机会获得车位的

Samaphore也可以用来用限流。即一次只允许有xx请求过来,多出的请求暂时等待直至被系统后续处理

构造方法摘要
Semaphore(int permits)
用给定的许可数和非公平的公平设置创建一个 Semaphore
Semaphore(int permits, boolean fair)
用给定的许可数和给定的公平设置创建一个 Semaphore

permits,可获得的信号量的总许可个数

fair,若信号量保证在争用时保证按着先进先出的顺序获得许可,则为true,否则false

常用方法摘要·
acquire()
从信号量处获得一个许可(信号量许可个数-1)
release()
释放一个许可至信号量 (信号量许可个数+1)

Semaphore能够控制线程对某一资源的并发数量,线程通过acquire()获得一个许可,release()释放一个许可。如果被同时并发的数量已达饱和,则其他acquire()则进入等待状态,直到有线程执行完任务调用release释放许可之后,其他线程才能得到许可。

举例:

public class SemaphoreDemo {

    public static void main(String[] args) {

        Semaphore semaphore = new Semaphore(3);

        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {

                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "占到了车位~");
                    Thread.sleep((long) (Math.random()*1000));
                    System.out.println(Thread.currentThread().getName() + "走了,车位空出来了~");
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }, String.valueOf("线程" + i)).start();
        }


    }

}

结果:

线程1占到了车位~
线程2占到了车位~
线程3占到了车位~
线程2走了,车位空出来了~
线程4占到了车位~
线程1走了,车位空出来了~
线程5占到了车位~
线程5走了,车位空出来了~
线程6占到了车位~
线程3走了,车位空出来了~
线程6走了,车位空出来了~
线程4走了,车位空出来了~


http://www.niftyadmin.cn/n/550842.html

相关文章

将计算机和用户移动到组织单位

1.1.1 将计算机和用户移动到组织单位 计算机加入域后&#xff0c;计算机账号在活动目录computers目录下。根据管理的需要将FileServer和ProfileServer移动到“服务器”组织单元。将Sales计算机账号移动到“销售部”&#xff0c;将Research移动到“研发部”。 点击“开始”“程序…

MySQL主从复制问题集锦

问题一&#xff1a;‘COULD NOT FIND FIRST LOG FILE NAME IN BINARY LOG INDEX FILE’ 这个报错通常伴随着Slave_IO_Running: No Slave_IO_Running: No 一方面原因是因为网络通信的问题也有可能是日志读取错误的问题。 解决方案&#xff1a; 从数据库停止slave slave stop;…

公式解析器

公式解析器&#xff08;1&#xff09;、 灵活输入公式和自变量的数值&#xff1b;&#xff08;2&#xff09;、 对公式进行运算符解析&#xff0c;判断语法正确与否&#xff1b;&#xff08;3&#xff09;、 出现错误时应予以提示出错位置&#xff1b;&#xff08;4&#xff09…

如何优雅地停止一个线程

通常情况下&#xff0c;我们不会手动停止一个线程&#xff0c;而是让线程运行结束自然停止。但是在异常情况下依然需要我们提前停止线程&#xff0c;如程序出错重启等。 为什么不强制停止线程&#xff1f; 对于Java而言&#xff0c;最正确的停止线程的方式是使用interrupt。但…

TruncationColumn 字符串超过行数的宽度用省略号代替

//GridView行数据绑定事件 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType DataControlRowType.DataRow) //如果是数据行 { string content e.Row.Cells[2].Text; //取指定列值 e.Row.Cells[2].Text …

还不理解ThreadLocal的看过来

文章目录ThreadLocal是什么&#xff1f;ThreadLocal与Thread、ThreadLocalMap是什么关系&#xff1f;ThreadLocal 有哪些常用方法?ThreadLocal使用须知ThreadLocal使用举例ThreadLocal为什么会内存泄露&#xff1f;ThreadLocal如何避免内存泄露&#xff1f;ThreadLocal是什么&…

下一代防火墙

下一代防火墙需要安全厂商不断的关注IT环境和客户需求的变化、持续专注的技术积累及创新&#xff0c;而厚积薄发的产品成果。下一代防火墙应该实实在在实现以下六大功能&#xff1a;基于用户防护、面向应用安全、高效转发平台、多层级冗余架构、全方位可视化、安全技术融合解惑…

基于Prometheus+Grafana 搭建监控平台

文章目录安装Prometheus1、从docker镜像操作搜索镜像&#xff0c;并拉取下来2、运行镜像3、在浏览器端访问http://localhost:9090即可进入prometheus管理页面Prometheus与SpringBoot集成安装Grafana1、从docker镜像操作搜索镜像&#xff0c;并拉取下来2、运行镜像3、在浏览器上…