Hystrix内部提供了两种模式执行逻辑:信号量和线程池。默认情况下,Hystrix使用线程池模式。那什么是信号量呢?
维基百科的定义:
信号量(英语:semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一;当线程完成一次对semaphore对象的释放(release)时,计数值加一。当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。semaphore对象的计数值大于0,为signaled状态;计数值等于0,为nonsignaled状态.
semaphore对象适用于控制一个仅支持有限个用户的共享资源,是一种不需要使用忙碌等待(busy waiting)的方法。
信号量作用控制同时访问的线程个数。Semaphore 翻译成字面意思为信号量, Semaphore 可以控制同时访问的线程个数, 通过acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。 Semaphore 类中比较重要的几个方法:
上面 4 个方法都会被阻塞,如果想立即得到执行结果,可以使用下面几个方法
//例子:若一个工厂有 5 台机器,但是有 8 个工人,一台机器同时只能被一个工人使用,只有使用完了,
//其他工人才能继续使用。那么我们就可以通过 Semaphore 来实现:
static class Worker extends Thread {
private int num;
private Semaphore semaphore;
public Worker(int num, Semaphore semaphore) {
this.num = num;
this.semaphore = semaphore;
}
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("工人" + this.num + "占用一个机器在生产...");
Thread.sleep(2000);
System.out.println("工人" + this.num + "释放出机器");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
CountDownLatch 和 CyclicBarrier 都能够实现线程之间的等待,只不过它们侧重点不同;
CountDownLatch 一般用于某个线程 A 等待若干个其他线程执行完任务之后,它才执行;而 CyclicBarrier 一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;另外, CountDownLatch 是不能够重用的,而 CyclicBarrier 是可以重用的。Semaphore 其实和锁有点类似,它一般用于控制对某组资源的访问权限。
最近一个感触是:心智和能力同等重要,顺境提升能力,逆境磨炼心智。共勉一下!