前话
今天太忙了,没有学习到什么新知识,就复习一下旧知识吧!
正文
在这里我来打个比方,来为大家介绍信号量。信号量,就像是在公交车上的椅子,椅子的数量是有限的,只有有空位的时候,才能坐上那个椅子。 这个就是信号量的类:Semaphore,我们先来看看他是如何new出来的,他的构造方法并不多,就两个,很容易理解,permits就是座位的数量----最大线程访问数,而fair顾名思义就是公平的意思,为true公平,false不公平,默认为不公平
public Semaphore(int permits) {
sync = new NonfairSync(permits);
}
public Semaphore(int permits, boolean fair) {
sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}
acquire就是抢座位的意思,如果座位满了,就等待,如果霸道点,还可以抢多个座位 release则相反,就是离开座位的意思 当然,release释放的信号量,不能在比acquire请求的信号量多,否则会导致信号量失效。(自己做实验的得出来的结论)
public class Main {
static class ThreadTest implements Runnable{
Semaphore semaphore;
public ThreadTest(Semaphore semaphore) {
this.semaphore = semaphore;
}
@Override
public void run() {
try {
semaphore.acquire();
semaphore.release();
System.out.println("你好呀,我是"+Thread.currentThread().getName());
Thread.sleep(3000);
} catch (InterruptedException e) {
System.out.println("对不起,线程因不可抗拒因素被打断");
}finally {
semaphore.release();
}
}
}
public static void main(String[] args) throws SocketException, InterruptedException {
Semaphore semaphore=new Semaphore(2);
ThreadTest test=new ThreadTest(semaphore);
new Thread(test).start();
new Thread(test).start();
new Thread(test).start();
new Thread(test).start();
new Thread(test).start();
}
}
availablePermits()就是获取剩余信号量 tryAcquire()是从信号量尝试获取一个许可,如果无可用许可,直接返回false,不会阻塞 tryAcquire(int permits)是尝试获取指定数目的许可,如果无可用许可直接返回false tryAcquire(int permits, long timeout, TimeUnit unit)是在指定的时间内尝试从信号量中获取许可,如果在指定的时间内获取成功,返回true,否则返回false
结语
那么信号量有什么用处呢?信号量能控制共享资源的使用频率,百度云大家都知道吧,限流下载就是一种卡资源(虽然原理可能不同,但是思想都差不多)。并且信号量比锁更灵活,信号量能在任意地方申请和释放,而锁则必须由同一个线程加锁和解锁。
|