美文网首页
Semaphore使用案例

Semaphore使用案例

作者: nextliving | 来源:发表于2018-04-22 12:56 被阅读318次

多线程编程是开发高并发应用的重点和难点,是许多互联网公司面试环节必不可少的部分.打算围绕多线程编程总结一些核心概念及它们之间的关系,本篇是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

参考

相关文章

网友评论

      本文标题:Semaphore使用案例

      本文链接:https://www.haomeiwen.com/subject/wqzqlftx.html