Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可. acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可. release()用来释放许可.注意,在释放许可之前,必须先获获得许可. 下面通过一个例子来看一下Semaphore的具体使用: 假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续…
在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger…
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 那你就out太多了,new Thread的弊端如下:a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom.c.…
java.util.concurrent.CountDownLatch 是一个并发构造,它允许一个或多个线程等待一系列指定操作的完成. CountDownLatch 以一个给定的数量初始化.countDown() 每被调用一次,这一数量就减一.通过调用 await() 方法之一,线程可以阻塞等待这一数量到达零. 利用它可以实现类似计数器的功能. 比如有一个任务A,它要等待其他5个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了. 举个例子: 有五个工人在为老板…
ConcurrentMap 是个接口,你想要使用它的话就得使用它的实现类之一. ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合: 在原有java.util.map接口基础上又新提供了4种方法,进一步扩展了原有Map的功能: public interface ConcurrentMap<K, V> extends Map<K, V> { //插入元素 V putIfAbsent(K key, V value); //移除元素 bool…
LinkedBlockingDeque是双向链表实现的阻塞队列.该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除): 在不能够插入元素时,它将阻塞住试图插入元素的线程:在不能够抽取元素时,它将阻塞住试图抽取的线程.: LinkedBlockingDeque还是可选容量的,防止过度膨胀,默认等于Integer.MAX_VALUE.: LinkedBlockingDueue没有进行读写锁的分离,因此同一时间只能有一个线程对其操作,因此在高并发应用中,它的性能…
LinkedBlockingQueue是一个基于链表的阻塞队列. 由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选. LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE. 此队列按 FIFO(先进先出)排序元素.队列的头部 是在队列中时间最长的元素.队列的尾部 是在队列中时间最短的元素. 新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素.链接队列的吞…
可以用原子方式更新的 long 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.AtomicLong 可用在应用程序中(如以原子方式增加的序列号),并且不能用于替换 Long.但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问. 1.AtomicLong…
几个线程都申请读锁,都能获取: import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 几个线程都申请读锁,都能用 */ public class MainRead { private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(); publi…