同步辅助类  线程池  并发集合类 都是在线程同步的基础上增加了一些同步的东西,在线程同步的基础上更好的实现线程同步.实现的效率更高,更方便而已.

多线程并不是很难 需要你把代码写出来...然后分析运行的效果.

软件包 java.util.concurrent   JDK1.5之后才出现的.  同步辅助类提供了更优秀的解决方案.

同步器

四个类可协助实现常见的专用同步语句。

Semaphore 是一个经典的并发工具。

CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。

CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。

Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。

类 Semaphore

一个计数信号量。从概念上讲,信号量维护了一个许可集。

Semaphore中维护了一个可许集,这个可许集的体现就是构造方法中传入一个int值

final Semaphore semaphore = new Semaphore(5);

信号量:Semaphore。

允许临界区(共享内容)内存在固定个数的线程,并发访问。

如果信号量为1.成为二进制信号量,和同步(synchronized) 效果一样。

场景:

一个混沌摊,一开始只有一个桌子,一张桌子同时只能被一个人使用,只有拿到许可之后才可以使用这个桌子.   后来有了5个桌子,最多能允许5个拿到许可的人同时访问.

 import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; public class SemaphoreDemo { public static void main(String[] args) {
final Semaphore semaphore = new Semaphore(5);
//Semaphore中维护了一个可许集,这个可许集的体现就是构造方法中传入一个int值
//有5个许可,同时允许5个线程同时来拿 for (int i = 0; i < 50; i++) { new Thread(new Runnable() { @Override
public void run() {
try {
semaphore.acquire();//获得一个许可,从5减去1,有许可的才让访问
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " :来了,现在有 "+(5-semaphore.availablePermits())+" 名顾客");//有几名顾客就意味着有多少个并发. try {
TimeUnit.SECONDS.sleep(new Random().nextInt(3));
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("-->" + Thread.currentThread().getName()
+ " :走了"); semaphore.release();//释放许可
}
}).start(); }
}
}

线程中的同步辅助类Semaphore的更多相关文章

  1. 线程中的同步辅助类CountDownLatch

    四个类可协助实现常见的专用同步语句.Semaphore 是一个经典的并发工具.CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号.事件或条件前阻塞执行.Cyc ...

  2. 线程中的同步辅助类Exchanger

    Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的. 允许两条线程之间交换数据.Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法 ...

  3. Java线程中的同步

    1.对象与锁 每一个Object类及其子类的实例都拥有一个锁.其中,标量类型int,float等不是对象类型,但是标量类型可以通过其包装类来作为锁.单独的成员变量是不能被标明为同步的.锁只能用在使用了 ...

  4. python线程中的同步问题

    多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000.但是由于是多线程访问,有可能出现下面情 ...

  5. JDK中线程中实现同步等待闭环的一种方式

    实际Thread类自带的join方法就实现了线程同步等待,具体可以通过案例实践,如下: 本文的重点不是join,而是另一种设计的同步等待实现,涉及的关键类有:Thread.Runable.Callab ...

  6. java线程中的同步锁和互斥锁有什么区别?

    两者都包括对资源的独占. 区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,也没有固定的执行顺序. 2:同步是线程通过一定的逻辑顺序占有资源,有一定的合作关系去完成任务.

  7. CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...

  8. Java中的5种同步辅助类

    当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问.线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线 ...

  9. Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semaphore、Phaser)

    我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...

随机推荐

  1. application.properties /application.yml官网查看配置;springboot application.properties 官网查看,info yml 查看;springboot.yml查看info;springboot.yml查看Actuator监控中心info

    官网查看: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#appendix 查看info ...

  2. HDU 1404 Digital Deletions (暴力博弈)

    题意:给定一个数字串,最长是6,然后有两种操作. 第一种是,把该串中的一个数字换成一个比该数字小的数,比如 5 可以换成 0,1,2,3,4.   e.g. 12345 --> 12341 第二 ...

  3. nginx proxy_pass后的url加不加/的区别

    在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走. 下面四种 ...

  4. Oracle中B-TREE索引的深入理解(转载)

    索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书, ...

  5. gcc和vs在c的一些区别

    1.switch中每个标签后面的命令在gcc中需要{}括起来以指明作用域. 2._itoa是非标准的c和c++扩展函数,在linux下可以使用sprintf(string,   "%d &q ...

  6. (最长上升子序列 并记录过程)FatMouse's Speed -- hdu -- 1160

    http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Other ...

  7. java基础-day16

    第05天 API 今日内容介绍 u  Object类 & System类 u  日期相关类 u  包装类&正则表达式 第1章   Object类 & System类 1.1  ...

  8. Visualise the Argyris basis functions

    """ Author: kinnala Visualise the Argyris basis functions. """ from sk ...

  9. [mobile]监听手机mobile上面软键盘的回车[enter]事件

    $(document).keypress(function(e) { if(e.which == 13) { if(!$(".qaSearchInput").val()) { Hn ...

  10. 分形之C折线

    前面讲了列维(levy)曲线,它是将一条线段不停地分形成两条长度相等且相互垂直的线段而生成.还有分形龙也是将一个线段对折成夹角为90度的两个线段.这一节展示的是将线段不停地分形成两条长度相等且夹角不固 ...