Semaphore

  • 在Semaphore信号量非常适合高并发访问限制,新系统在上线之前,要对系统的访问量进行评估,评估是经过以往的经验、数据、历年的访问量,已经推广力度进行一个合理的评估
  • 当然评估标准不能太大也不能太小,太大的话投入的资源达不到实际效果,纯粹浪费资源,太小的话,某个时间点一个高峰值的访问量上来直接可以压垮系统

相关概念

  • PV(page view)网站的总访问量,页面浏览量或点击量,用户每刷新一次就会被记录一次
  • UV(unique Visitor)访问网站的一台电脑客户端为一个访客。一般来讲时间上以00:00-24:00之内相同ip的客户端只记录。
  • QPS(query per second)即每秒查询数,qps很大程度上代表了系统业务上的繁忙程度,每次请求的背后,可能对应着多次磁盘I/O,多次网络请求,多个cpu时间片等。我们通过qps可以非常直观的了解当前系统业务情况,一旦当前qps超过所设定的预警阀值,可以考虑增加机器对集群扩容,以免压力过大导致宕机,可以根据前期的压力测试得到估值,在结合后期综合运维情况,估算出阀值
  • RT(response time)请求的响应时间,这个指标非常关键,直接说明前端用户的体验,任何系统设计师都想降低rt时间。
  • 当然还涉及cpu、内存、网络、磁盘等情况,更细节的问题很多,如select、update、delete/ps等数据库层面的统计。
  • 容量评估:一般来说通过开发、运维、测试、以及业务等相关人员,综合出系统的一系列阀值,然后我们根据关键阀值如qps、rt等,对系统进行有效的变更
  • 一般来讲,我们进行多轮压力测试以后,可以对系统进行峰值评估,采用所谓的80/20原则,即80%的访问请求将在20%的时间内达到。这样我们可以根据系统对应的PV计算出峰值qps
  • 峰值qps= (总PV × 80%)/ (60 × 60 × 24 × 20%) 然后在将总的峰值qps除以单台机器所能承受的最高的qps值,就是所需要机器的数量:机器数 = 总的峰值qps / 压测得出的单机极限qps
  • 当然不排除系统在上线前进行大型促销活动,或者双十一、双十二热点事件、遭受到DDos攻击等情况,系统的开发和运维人员急需要了解当前系统运行的状态和负载情况,一般都会有后台系统去维护

代码示例

package com.example.core.juc;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;public class UseSemaphore {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(20);//定义20个线程Semaphore semaphore = new Semaphore(5);//每次只容许5个线程进行操作,进行限流for(int index = 1;index <= 20; index++){final int token = index;Runnable run = new Runnable() {@Overridepublic void run() {try{semaphore.acquire();//进行相关的业务操作System.out.println("获得许可操作:"+token);long sleepTime = (long)(Math.random() * 10000);Thread.sleep(sleepTime);}catch(InterruptedException e){e.printStackTrace();}finally{semaphore.release();}}};executorService.execute(run);}//        semaphore.getQueueLength();//取得等待许可的线程个数executorService.shutdown();}
}
/*
获得许可操作:5
获得许可操作:2
获得许可操作:1
获得许可操作:4
获得许可操作:3
获得许可操作:8
获得许可操作:9
获得许可操作:6
获得许可操作:7
获得许可操作:10
获得许可操作:11
获得许可操作:12
获得许可操作:13
获得许可操作:14
获得许可操作:15
获得许可操作:16
获得许可操作:17
获得许可操作:18
获得许可操作:19
获得许可操作:20*/

Java JUC工具类--Semaphore相关推荐

  1. java semaphore 等待时间_一个java同步工具类Semaphore的详解

    Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了.这篇文章将对Semaphore的概念和使用进行一个详解. 一.概念理解 官方是这样 ...

  2. Java JUC工具类--ForkJoin

    ForkJoin Fork/Join框架是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架 Fork/Join中两个重要的类 ...

  3. Java JUC工具类--Future

    Future模式,也是非常经典的设计模式,这种模式主要就利用空间换时间的概念,也就是说异步执行(需要开启一个新的线程) 在互联网高并发的应用服务中,我们随处可见这种理念和代码,主要就是使用了这种模式 ...

  4. Java并发工具类Semaphore应用实例

    1 package com.thread.test.thread; 2 3 import java.util.Random; 4 import java.util.concurrent.*; 5 6 ...

  5. Java JUC工具类--Master-Worker

    Master-Worker Master-Worker模式是常用的并行计算模式.它的核心思想是系统由两类进程协作工作:Master进程和Worker进程 Master负责接收和分配任务,Worker负 ...

  6. Java JUC工具类--Exchanger

    Exchanger Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据 两个线程通过exchange方法交换数据,如果一个线程先执行exchange ...

  7. Java JUC工具类--CyclicBarrier

    CyclicBarrier:栅栏的概念,多线程的进行阻塞,等待某一个临界值条件满足后,同时执行 类比:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待 p ...

  8. Java JUC工具类--CountDownLatch

    CountDownLatch:用于监听某些初始化操作,并且线程进行阻塞,等初始化执行完毕后,通知主线程继续工作执行 package com.example.core.juc;import java.u ...

  9. Java并发工具类(闭锁CountDownLatch)

    并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...

最新文章

  1. 改变jupyter notebook的主题背景颜色
  2. 将ubuntu光盘作为安装源_[转载]Ubuntu 以光盘做为软件源
  3. MySQL/ACCESS导出一句话拿WebShell后门命令
  4. 《看聊天记录都学不会Python到游戏实战?太菜了吧》(8)我们开始做一个数字小游戏吧
  5. 前端学习(1553):复习2
  6. 5G格局剧变!苹果高通和解,英特尔退票出局,华为独善其身
  7. 使用SQL语句获得服务器名称和IP 地址
  8. 二十、Oracle学习笔记:编写存储过程
  9. android 视频录制 sdk,android视频录制实现方法
  10. hdu 5857 Median ★
  11. Echarts世界地图中国分区显示
  12. Spatial Transformer Networks(STN)-代码实现
  13. 有线路由器后接无线路由器
  14. 单端正激——隔离型DC/DC变换器的建模与仿真
  15. DolphinScheduler 3.0.0-alpha 安装问题
  16. 名帖109 鲜于枢 小楷《老子道德经卷》
  17. SSTV 建伍TK8185 连接电脑
  18. idea查看类层次结构图
  19. 【转】dd命令详解及利用dd测试磁盘性能
  20. 拼多多引流产品卖什么好?拼多多卖什么好?

热门文章

  1. 用python做一个简单的投票程序_以一个投票程序的实例来讲解Python的Django框架使...
  2. 详解ASP.NET页面生命周期事件
  3. 什么是runtime?
  4. 【2019南昌邀请赛现场赛 - G】Winner(建图,tarjan缩点 或 贪心)
  5. 中位数及带权中位数问题(转)
  6. ACM - 欧拉函数(内容)
  7. java什么时候创建进程,Java创建进程
  8. python中long类型_浅谈python 四种数值类型(int,long,float,complex)
  9. h5 网站滚动到某个位置
  10. vbs隐藏cmd命令窗口调用bat程序执行class