Semaphore叫做信号量

可以控制某个资源可被同时访问的个数,

acquire() 获取一个许可,得到许可才能执行后面的代码,如果没有就等待。

release() 释放一个许可。

当信号量的只允许一个线程访问时,就变成了锁的功能。

如下所示 :Semaphore semaphore = new Semaphore(1); 

下面代码演示

public class SemaphoreTest {
public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool();
//创建一个信号量 只允许一个线程访问
Semaphore semaphore = new Semaphore(1);
for (int i = 0; i < 10; i++) {
final int NO = i;
Runnable run = new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("thread "+NO +" "+(System.currentTimeMillis()/1000));
Thread.sleep((long) 1000);
} catch (Exception e) {
e.printStackTrace();
} finally {
semaphore.release();
} }
};
exec.execute(run);
}
// 退出线程池
exec.shutdown();
}
}

  执行结果如下

每一秒钟只能允许一个线程执行。

java多线程系列7 高级同步工具(1)信号量Semaphore的更多相关文章

  1. java多线程系列9 高级同步工具(3) CyclicBarrier

    CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)   然后一再执行 public class CyclicBar ...

  2. java多线程系列8 高级同步工具(2)CountDownLatch

    CountDownLatch,计数器的初始值为线程的数量.每当一个线程完成了自己的任务后, 计数器的值就会减1.当计数器值到达0时,它表示所有的线程已经完成了任务, 然后在闭锁上等待的线程就可以恢复执 ...

  3. java多线程系列3-线程同步

    如果一个资源被多个线程同时访问,可能会遭到破坏,这篇文章介绍java线程同步来解决这类问题 引入问题 某电影院目前正在上映贺岁大片,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售 ...

  4. JAVA多线程提高九:Semaphere同步工具

    java 中Semaphere可类比操作系统信号量,硬件资源如IO.内存.磁盘等都是有固定量的,多个程序需要竞争这些资源,没有资源就需要被挂起. 一.类和方法摘要 构造函数: public Semap ...

  5. JAVA多线程提高十四:同步工具Exchanger

    Exchanger可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视 ...

  6. java多线程系列 目录

    Java多线程系列1 线程创建以及状态切换    Java多线程系列2 线程常见方法介绍    Java多线程系列3 synchronized 关键词    Java多线程系列4 线程交互(wait和 ...

  7. java多线程系列8-线程的优先级

    在java中设置线程优先级使用setPriority,在jdk中的源代码如下: public final void setPriority(int newPriority) { ThreadGroup ...

  8. Java 并发包中的高级同步工具

    Java 并发包中的高级同步工具 Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提供了各种功能支持,比如: 提供了线 ...

  9. Java多线程系列--“JUC锁”06之 Condition条件

    概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括:Condition介绍Condition函数列表Condition示例转载请注明出处 ...

随机推荐

  1. commit lint规范化团队git提交信息

    一.快速提交符号angular编码规范的提交信息 1.命令行中安装commitizen: npm install -g commitizen commitizen init cz-convention ...

  2. echars柱状图修改每条柱的颜色

    在实际开发中,可能会需要到柱状图内某个柱需要特殊颜色表示,我这里的应用是排名,突出显示出当前的数据. 在Color参数中添加一个方法可以任意返回需要的颜色值 function (params) { i ...

  3. centos7升级Python2.x到3.x

    CentOS 7 中默认安装了 Python,版本比较低(2.7.5),为了使用新版 3.x,需要对旧版本进行升级.由于很多基本的命令.软件包都依赖旧版本,比如:yum.所以,在更新 Python 时 ...

  4. 学习 MeteoInfo二次开发教程(四)

    教程四的问题不大. 1.private void AddMapFrame_ChinaSouthSea().private void AddTitle()两个函数和public Form1()函数并列. ...

  5. php多维数组排序

    数组 array(11) { [0] => array(7) { ["food_id"] => string(2) "31" ["food ...

  6. sqlserver 书查询 之二

    WITH treeAS(SELECT ParentId, Organization_ID,1 AS x2level,Organization_Name,CAST(Organization_Name A ...

  7. java新手抖机灵(java新手技巧)

    java新手抖机灵(java新手技巧) 1.交换两个整数的值 好处是不用定义临时变量,显得代码简洁,提高运行效率 其实也可以用+-*/进行这种运算 比如可以这样: a = a + b; b = a - ...

  8. leetcode198

    public class Solution { public int Rob(int[] nums) { ; ; ; k < nums.Length; k++) { int tmp = i; i ...

  9. leetcode1026

    public class Solution { Stack<int> S = new Stack<int>(); ; public void Trace(TreeNode ro ...

  10. django毕设之路1.0

    Django的核心理念 1.更python化 2.DRY:(don't repeat yourself),不做重复的工作 3.松耦合和灵活 4.快速开发 2.Django的MTV概 M:Model模型 ...