通过一段程序理解信号量机制
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