多线程编程是开发高并发应用的重点和难点,是许多互联网公司面试环节必不可少的部分.打算围绕多线程编程总结一些核心概念及它们之间的关系,本篇是Semaphore.
Semaphore
简介
Semaphore是JDK1.5中引入的,中文一般译为信号量,我把它翻译为信号局.
许可证(permit)
permit是信号局中非常重要的概念,一个线程只有从信号局取得许可证才能拥有执行权.一个线程可以通过Semaphore的semaphore.acquire()
方法取得一张许可证,也可以通过semaphore.acquire(n)
取得n张许可证,如果信号局剩下的许可证不足n张则线程会一直阻塞等待.有借当然有还,可以通过semaphore.release()
归还1张许可证,也可以通过semaphore.release(n)
归还n张许可证.
适用场景
系统中某类资源比较紧张,只能被有限的线程访问,此时适合使用信号量.
案例
案例
共有20个线程等待访问主线程中的一个变量,但是该变量同时只能被最多3个线程访问.
案例代码
主要为2个类,Visitor.java和VisitorTest.java.
Visitor.java代码如下:
package com.ms.thread.semaphore;
import java.util.concurrent.Semaphore;
/**
* @author chenxin
* @since 2018-04-20
*/
public class Visitor implements Runnable {
private Semaphore semaphore;
public Visitor(Semaphore sp) {
this.semaphore = sp;
}
@Override
public void run() {
try {
//必须取得许可证才能访问主线程变量
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
//访问主线程变量
System.out.println(Thread.currentThread().getName()+"拜访主线程."+"主线程名字是:"+VisitorTest.name+". 剩余许可证数量:"+semaphore.availablePermits());
//访问完毕归还许可证
semaphore.release();
}
}
VisitorTest.java代码如下:
package com.ms.thread.semaphore;
import java.util.concurrent.Semaphore;
/**
* 测试Visitor类
* @author chenxin
* @since 2018-04-20
*/
public class VisitorTest {
public static String name = "iengchen";
//定义访问线程数量
private static int vistorNum = 20;
public static void main(String[] args) {
//定义许可证数量
Semaphore semaphore = new Semaphore(3);
for(int i=0; i<vistorNum; i++) {
new Thread(new Visitor(semaphore), "vistor-"+i).start();
}
}
}
案例执行结果
结果如下:
vistor-1拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-2拜访主线程.主线程名字是:iengchen. 剩余许可证数量:0
vistor-0拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-8拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-9拜访主线程.主线程名字是:iengchen. 剩余许可证数量:2
vistor-3拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-10拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-11拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-4拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-12拜访主线程.主线程名字是:iengchen. 剩余许可证数量:0
vistor-5拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-13拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-7拜访主线程.主线程名字是:iengchen. 剩余许可证数量:0
vistor-6拜访主线程.主线程名字是:iengchen. 剩余许可证数量:0
vistor-14拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-15拜访主线程.主线程名字是:iengchen. 剩余许可证数量:2
vistor-16拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-17拜访主线程.主线程名字是:iengchen. 剩余许可证数量:1
vistor-18拜访主线程.主线程名字是:iengchen. 剩余许可证数量:2
vistor-19拜访主线程.主线程名字是:iengchen. 剩余许可证数量:2
网友评论