当前位置: 首页 > news >正文

微营销 网站模板汕头市官网

微营销 网站模板,汕头市官网,vs简易新闻建设网站,企业关键词排名优化哪家好目录 JUC并发编程之Semaphore-应用与深度源码剖析 1. Semaphore 是什么? 2.怎么使用Semaphore? 2.1构造方法 2.2 重要方法 2.3 基本使用 需求场景 基础版代码实现 tryAcquire()引入代码实现 acquireUninterruptibly(),acquire()对比代码实现 3.…

目录

JUC并发编程之Semaphore-应用与深度源码剖析

1. Semaphore 是什么?

2.怎么使用Semaphore?

2.1构造方法

2.2 重要方法

2.3 基本使用

需求场景

基础版代码实现

tryAcquire()引入代码实现

acquireUninterruptibly(),acquire()对比代码实现

 3.源码剖析【重点】

底层结构图:

思路总结:

semaphore.acquire():

semaphore.release():


 JUC并发编程之Semaphore-应用与深度源码剖析

1. Semaphore 是什么?

Semaphore字面意思是信号量的意思,它的作用就是控制访问特定资源的线程数目,底层依赖AQS的状态State,是在生产当中比较常用的一个工具类。

2.怎么使用Semaphore?

2.1构造方法

public Semaphore(int permits)
public Semaphore(int permits, boolean fair)

permits表示许可线程的数量

fair表示公平性,如果这个设为true的话,下一次执行的线程就会是等待最久的线程

2.2 重要方法

public void acquire() throws InterruptedException
public void release()
tryAcquire(int args,long timeout, TimeUnit unit)
  • acquire() 表示阻塞并获取许可
  • release() 表示释放许可

2.3 基本使用

需求场景

资源访问,服务限流Hystrix里面限流底层就是基于信号量的方式,如图所示:

基础版代码实现

/*** @Description: TODO* @Author: etcEriksen* @Date: 2023/3/7**/
@Slf4j
@SuppressWarnings({"all"})
public class SemaphoreRunner {public static void main(String[] args) {//构造参数为:2,表示的含义为:该Semaphore所带有的总公共资源为2Semaphore semaphore = new Semaphore(2);for (int i = 0; i < 10; i++) {new Thread(new Task(semaphore,"leomessi:"+i)).start();}}static class Task extends Thread {Semaphore semaphore ;public Task(Semaphore semaphore,String tname) {super(tname) ;this.semaphore = semaphore ;}@Overridepublic void run() {try {//semaphore.acquireUninterruptibly();semaphore.acquire(2);//获取2个公共资源才可以通过一个线程 【带有中断抛出异常的机制】log.info(Thread.currentThread().getName()+":aquire at time:" + System.currentTimeMillis()) ;Thread.sleep(5000) ;semaphore.release(2) ;//归还公共资源,并且归还的公共资源数量要和一个线程通过时获取的公共资源数量要持平} catch (Exception e) {e.printStackTrace();}}public void fallback() {log.info("降级");}}}

代码分析:

运行结果:

tryAcquire()引入代码实现

/*** @Description: TODO* @Author: etcEriksen* @Date: 2023/3/7**/
@Slf4j
@SuppressWarnings({"all"})
public class SemaphoreRunner {public static void main(String[] args) {//构造参数为:2,表示的含义为:该Semaphore所带有的总公共资源为2Semaphore semaphore = new Semaphore(2);for (int i = 0; i < 10; i++) {new Thread(new Task(semaphore,"leomessi:"+i)).start();}}static class Task extends Thread {Semaphore semaphore ;public Task(Semaphore semaphore,String tname) {super(tname) ;this.semaphore = semaphore ;}@Overridepublic void run() {try {
//                //semaphore.acquireUninterruptibly();// semaphore.acquire();//获取2个公共资源才可以通过一个线程 【带有中断抛出异常的机制】
//                Thread.sleep(5000) ;
//                semaphore.release(2) ;//归还公共资源,并且归还的公共资源数量要和一个线程通过时获取的公共资源数量要持平if (semaphore.tryAcquire(500, TimeUnit.MILLISECONDS)) {log.info(Thread.currentThread().getName()+":aquire at time:" + System.currentTimeMillis()) ;Thread.sleep(5000);semaphore.release();//释放公共资源} else {//如果500毫秒线程还没有获取到相对应的2个公共资源,那么降级处理fallback();}} catch (Exception e) {e.printStackTrace();}}public void fallback() {log.info("降级");}}}

分析代码:这里结合了降级处理

运行结果:

acquireUninterruptibly(),acquire()对比代码实现

acquire():当线程被中断后,会抛出InterruptException异常。

acquireUninterruptibly():当线程被中断后,不会抛出异常。

acquireUninterruptibly(): 结合代码分析

运行结果

 acquire():结合代码分析

 运行结果:

 3.源码剖析【重点】

底层结构图:

ProcessOn Flowchart

思路总结:

初始化Semaphore对象时指定总资源数量,多个线程进来时会去竞争该公共资源,但是在公平锁的情况下,会维护一个CLH阻塞队列,该队列为公平队列,从前往后进行唤醒获取公共资源。当公共资源不够当前线程使用时或CLH阻塞队列存在节点时,新进来的线程对象都会被封装为Node节点加入到CLH阻塞队列的尾部,公平等待时机。非公平锁时,与之正好相反。

semaphore.acquire():

 1.

2.

 3.

 acquireSharedInterruptibly()调用的tryAcquireShared解析:

acquireSharedInterruptibly()调用的doAcquireSharedInterruptibly解析:

 很多相同的源码在之前的源码分析中都详细介绍了,所以这里只记录新出现的源码思路:

注:doAcquireSharedInterruptibly方法调用的tryAcquireShared方法

4.应用层调用Interrupt()方法

应用层的interrupt()中断方法调用后,底层park阻塞被中断,那么继续向下执行代码:

interrupt()方法给当前线程打上中断标识啦,所以调用interrupted()方法时返回true并且消除中断标识。

semaphore.release():

该方法后之前源码分析的lock.unlock()的思路基本一致。简略记录:

1.

2.

3.

 

 

http://www.yayakq.cn/news/844965/

相关文章:

  • 手机网站快速dede生成网站地图
  • 中小型网站建设行情wordpress子目录站点
  • 网站建设赠送seo个人网站做推广
  • 室内设计在线网站如何网站点击率
  • 南宁在哪里推广网站网络公司网站建设规划
  • 做网站友汇网wordpress 分类信息插件
  • 做网站的专业叫什么开源多用户商城系统
  • 许嵩做的网站长沙专业做网站公司哪家好
  • 个人网站建设方案书用备案的wordpress网站开发代码
  • 响应式网站如何设计wordpress 开发框架
  • 陕西企业网站建设建大网络
  • 安居客房产官方网站网络营销的特点有
  • 文化传媒公司能否建设经营网站品牌网站建设要多少钱
  • 好看的网站后台界面wordpress单页视差
  • 属于网站开发工具的是汽车租赁网站怎么做
  • 动漫做的游戏 迅雷下载网站有哪些用wordpress制作网站
  • 郑州企业网站快速优化价格空调维修技术支持深圳网站建设
  • 手机浏览器主页网站推荐开发网站 语言
  • dede网站地图模版wordpress代码解释
  • 外贸网站测速北京赵公口网站建设
  • 重庆住房城乡建设部网站鄂州网站建设报价
  • 织梦协会网站模板女生做网站编辑好吗
  • 重庆王网站制作网站外包一般多少钱啊
  • 网站建设需要的客户资料济南网站排名推广
  • 示范校建设平台网站典型案例跨境电商平台有哪些营销方式
  • 外贸网站建设推广优化网站规划课程设计模板
  • 湘潭做网站广告的公司百度一下你就知道官网网页版
  • 昆明自助建站软件如何在360做网站SEO
  • 网站开发与设计实训报告总结网页布局网站
  • 织梦做手机网站郑州网络公司做医疗网站