Semaphore

控制对资源的并发访问数,构造时如果传参为1,则近似于ReentrantLock,差别在于锁的释放。可以一个线程获取锁,另外一个线程释放锁,在一些死锁处理的场合比较适用。

如上所示,信号量为4,当超过4个并发试图访问共享资源时,多出来的线程(红色部分)会被阻塞,直至有线程释放信号量。

使用示例如下:

 @Test
public void test1() {
final Semaphore semaphore = new Semaphore(2);
ExecutorService executorService = Executors.newCachedThreadPool(); final AtomicInteger executeNums = new AtomicInteger();
for(int num = 0; num < 20; num++) {
executorService.execute(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
System.err.println("thread-" + Thread.currentThread().getId());
Thread.sleep(1000);
executeNums.incrementAndGet();
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
} while (executeNums.get() < 20) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
executorService.shutdown();
}

最新文章

  1. Promise编程基础
  2. eclipse + maven 搭建springMVC+Spring+mybatis 系统
  3. 阿里云:linux 一键安装web环境
  4. UVa 10837 A Research Problem 欧拉函数
  5. Python学习笔记4(函数与模块)
  6. &lt; high performance web sites &gt; 阅读小记
  7. 什么是Java Bean
  8. 微信自定义菜单errcode(40016)
  9. 从 PC 卸载 Office
  10. oracle中的日期函数的使用
  11. 498. Diagonal Traverse对角线z型traverse
  12. 跟着未名学Office - 高效工作Outlook
  13. windows 下跟踪日志的几个工具总结
  14. 函数参数,const 引用 和 非 const引用是不同的函数。
  15. FortiGate软件版本升级
  16. string+和stringbuffer的速度比较
  17. json字符串和Json对象,以及json的基本了解
  18. Oracle 分析函数及常用函数
  19. css3代码整理—弹性盒子篇
  20. 从0开始 图论学习 邻接表 STL vector

热门文章

  1. jdbc执行过程 jar包下载
  2. java连接Redis初始化jedis失败!
  3. 【MYSQL笔记3】MYSQL过程式数据库对象之存储过程的调用、删除和修改
  4. springboot中有用的几个有用aware以及bean操作和数据源操作
  5. Flask中异常捕获
  6. 你知道JQuery中的事件冒泡吗,他是怎么执行的,如何来停止冒泡事件?
  7. Mina 组件介绍之 IoBuffer
  8. 百度app红包? 百度全家桶?果断卸载
  9. 移植Linux Kernel SM750 驱动到VxWorks 7
  10. centos7上部署新版 jumpserver 跳板机服务