Semaphore-限制对某个共享资源进行访问的线程的数量 https://my.oschina.net/u/1445731/blog/200413
Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。
Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore。一般的用法是,用于限制对于某一资源的同时访问。
信号量可以用来限制对某个共享资源进行访问的线程的数量。在对资源进行访问之前,线程必须从得到信号量的许可(调用Semaphore对象的acquire()方法);在完成对资源的访问后,线程必须向信号量归还许可(调用Semaphore对象的release()方法)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package javasedemo; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /** * * @author htc */ public class JavaSEDemo { /** * @param args the command line arguments */ public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能个线程同时访问 final Semaphore semph = new Semaphore(3); // 模拟个客户端访问 for (int index = 1; index < 10; index++) { final int NO = index; Runnable ru = new Runnable() { public void run() { try { // 获取许可 semph.acquire(); System.out.println("accessing: " + NO); Thread.sleep((long) (Math.random() * 1000)); // 访问完后,释放 System.out.println("release: " + NO); semph.release(); } catch (InterruptedException e) { } } }; exec.execute(ru); } // 退出线程池 exec.shutdown(); } } |
run:
accessing: 1
accessing: 2
accessing: 3
release: 3
accessing: 6
release: 2
accessing: 4
release: 4
accessing: 5
release: 1
accessing: 7
release: 7
accessing: 8
release: 5
accessing: 9
release: 6
release: 8
release: 9
成功构建 (总时间: 2 秒)
Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore。一般的用法是,用于限制对于某一资源的同时访问。