谈谈对信号量Semaphore的理解

通过一段程序理解信号量机制

package com.study.lock.aqs.jucdemo.semaphore;

import java.util.Random;
import java.util.concurrent.Semaphore;

/**
 * Created by FKQ on 2019/3/26.
 */
public class SemaphoreTest {
    public static void main(String[] args) throws InterruptedException {
        SemaphoreTest semaphoreTest = new SemaphoreTest();
        Semaphore semaphore = new Semaphore(4);
        for (int i= 0;i< 10;i++){
            String vip ="vip-"+i;
            new Thread(()->{

                try {
                    semaphore.acquire();
                    semaphoreTest.SemahoreService(vip);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();
                }

            }).start();

        }

    }
    public void SemahoreService(String vip) throws  InterruptedException{
        System.out.println("迎接贵宾一位"+vip);
        Thread.sleep(new Random().nextInt(3000));
        System.out.println("欢送贵宾出门"+vip);
    }
}
迎接贵宾以为vip-1
迎接贵宾以为vip-0
迎接贵宾以为vip-5
迎接贵宾以为vip-2
欢送贵宾出门vip-0
迎接贵宾以为vip-4
欢送贵宾出门vip-2
迎接贵宾以为vip-6
欢送贵宾出门vip-1
迎接贵宾以为vip-7
欢送贵宾出门vip-5
迎接贵宾以为vip-3
欢送贵宾出门vip-6
迎接贵宾以为vip-8
欢送贵宾出门vip-7
迎接贵宾以为vip-9
欢送贵宾出门vip-4
欢送贵宾出门vip-8
欢送贵宾出门vip-9
欢送贵宾出门vip-3

笔者在网上看见了几篇文章关于信号量的介绍,可能大家多其说难以理解,我会通过一些不是那么专业的术语帮助大家的理解,顾名思义,通过名字大家都会猜到既然是信号量,跟红绿灯一个样子他是所有的车子都能看见的,即他是所有线程都是可见的,因此不难猜想他的底层是一把共享锁,打开他的源码不难发现,Semaphore的底层使用了AQS的共享机制。在现实生活中红绿灯的其中一个作用就是限制车的流量,而Semaphore一个道理我们可以做为限流的操作,笔者在构造函数初始化的时候限流了4个线程,代表着最大线程数为4,同一时间只能有四个线程操作。从结果不难看出来,当线程到达四个就阻塞住,等有空闲数才会进行下一步的操作。

以上是笔者通过一个简单的程序帮助大家的理解,希望对大家有些,如果有说的不好地方欢迎讨论,或者加笔者微信。
VX:549896196

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值