性能测试做到后面,一些特殊的场景利用常用的现成工具满足不了需求,所以你需要学习 java 写一些特定协议的压测脚本,那你不得不研究多线程或线程池,而此时你也一定会遇到 java 并发编程中的几个类,今天重点讲解这 3 个类,CountDownLanch、CyclicBarrier、Semaphore,希望大家以后看到的时候知道是干嘛用的。
接下来,我就最近学习的成果,下面和大家举例子讲解一下,帮助理解。当然篇幅原因,完整的 java 代码例子
场景
工作中往往会遇到需要异步处理的任务,此时我们就会利用多线程的方式去处理,即启动子线程去执行任务,而此时主线程阻塞,等待所有的子线程完成任务后,再去做一些汇总统计工作。
CountDownLanch 是一个倒数计数器, 给一个初始值 (>=0), 然后每一次调用 countDown 就会减 1, 这很符合等待多个子线程结束的场景: 一个线程结束的时候, countDown 一次, 直到所有的线程都 countDown 了 , 那么所有子线程就都结束了。
先看看 CountDownLanch 提供的方法。
await: 会阻塞等待计数器减少到 0 位置. 带参数的 await 是多了等待时间。
countDown: 将当前的计数减 1。
getCount(): 返回当前的计数。
显而易见, 我们只需要在子线程执行之前, 赋予初始化 countDownLanch, 并赋予线程数量为初始值。
每个线程执行完毕的时候, 就 countDown 一下。主线程只需要调用 await 方法, 可以等待所有子线程执行结束。
场景
我们在做压测的时候,如要真正的并发,那么在创建线程成功后需要等待其他线程也创建好了,一起等着,同时发送请求,此时就用到了 CyclicBarrier。
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。
场景
有时候并发太大的时候,我们需要人工的控制,譬如一些数据库的连接数这样子的,资源毕竟有限的,不可能无限去创建连接,此时我们就需要利用 Semaphore 去控制。
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。可以控制系统的流量,拿到信号量的线程可以进入,否则就等待。通过 acquire() 和 release() 获取和释放访问许可。
更多性能测试相关学习可以关注公众号大话性能。