Semaphore信号量应用

一、Semaphore(详见JDK-API)
  一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。
二、应用场景
  在semamphore信号量非常适合高并发访问,在新系统上线之前,要对系统的访问量进行评估。当然这个值肯定不是随随便便就想出来的,是经过以往的经验,数据,历年的访问量,已经推广力度进行一个合理的评估,当然评估标准不能太大也不能太小,太大的话,投入的资源达不到实际的效果,纯粹浪费资源,太小的话,某个时间点一个高峰值的访问量上来可以直接压垮系统。
   PV(page view)网站的总访问量。页面的浏览量或者点击量,用户每刷新一一次,或者点击一次,就会被记录。
   UV(unique visitor)独立访客。访问网站的一台电脑客户端为一个访客,一般来讲,时间从00到24点之内相同的ip客户端只记录一次。
   UV(query per second)即每秒查询数。 qps很大程度上代表了系统业务上的繁忙程度,每次请求的背后,可能应对着多次磁盘I/O , 多次网络请求,多个CPU时间片等。我们通过qps非常客观的了解当前业务情况。一旦当前的qps超过了所设定的预警阀值,可以考虑增加机器对集群扩容,以免压力过大导致宕机,可以根据前期的压力测试得到估值,在结合后期的综合运维的情况,估算出阀值。
   RT(response time)请求的响应时间。 这个指标非常的关键,直接说明前端用户的体验,因此任何系统设计师都想降低RT时间
  当然还涉及cpu,内存,网络,磁盘等情况,如select,delete,update等数据库层面的东西
   容量评估。一般来说通过开发,运维,测试,以及业务相关人等。综合出系统的一系列阀值,然后我们根据相关阀值如qps,rt等,对系统进行有效的变更。
   一般来讲,进行多次压力测试后,可以对系统进行峰值进行评估,采用所谓80/20原则,即80%的访问请求,将在20%的访问时间内达到,这样我们可以根据系统对应的pv计算出峰值qps
   峰值qps=(总pv * 80%)/ ( 60 * 60 * 24 * 20% )
   然后再将总的峰值qps除以单台机器所能承受的最高的qps值,就是所需要机器的数量.机器数量=总的峰值qps / 压测得出的单机极限qps
  当然不排除系统在上线前进行大规模的促销活动,或者双十一,双十二热点事件,遭受到DDos攻击等情况。系统的开发和运维人员急需要了解当前系统的运行状态和负载情况,一般都会有后台系统去维护。
   semaphore可以控制系统的流:拿到信号量的线程可以进入,否则就等待。通过acquire()和release()获得或者释放许可

public class UseSemaphore {  
  
    public static void main(String[] args) {  
        // 线程池  
        ExecutorService exec = Executors.newCachedThreadPool();  
        // 只能5个线程同时访问  
        final Semaphore semp = new Semaphore(5);  
        // 模拟20个客户端访问  
        for (int index = 0; index < 20; index++) {  
            final int NO = index;  
            Runnable run = new Runnable() {  
                public void run() {  
                    try {  
                        // 获取许可  
                        semp.acquire();  
                        System.out.println("Accessing: " + NO);  
                        //模拟实际业务逻辑
                        Thread.sleep((long) (Math.random() * 10000));  
                        // 访问完后,释放  
                        semp.release();  
                    } catch (InterruptedException e) {  
                    }  
                }  
            };  
            exec.execute(run);  
        } 
        
        try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        
        //System.out.println(semp.getQueueLength());
        
        
        
        // 退出线程池  
        exec.shutdown();  
    }  
  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值