04 JDK并发包相关类

1 Condition

Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协做,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协做更加安全和高效。Condition须要结合ReentrantLock使用。java

Condition的优点是支持多路等待,便可以定义多个Condition,每一个condition控制线程的一条执行通路,是对传统方式的优化。传统方式只能是一路等待。缓存

方法名称安全

描述多线程

await()并发

当前线程进入等待状态直到被通知(signal)或者中断;优化

当前线程进入运行状态并从await()方法返回的场景包括:spa

(1)其余线程调用相同Condition对象的signal/signalAll方法,而且当前线程被唤醒;操作系统

(2)其余线程调用interrupt方法中断当前线程;线程

awaitUninterruptibly()对象

当前线程进入等待状态直到被通知,在此过程当中对中断信号不敏感,不支持中断当前线程

awaitNanos(long)

当前线程进入等待状态,直到被通知、中断或者超时。若是返回值小于等于0,能够认定就是超时了

awaitUntil(Date)

当前线程进入等待状态,直到被通知、中断或者超时。若是没到指定时间被通知,则返回true,不然返回false

signal()

唤醒一个等待在Condition上的线程,被唤醒的线程在方法返回前必须得到与Condition对象关联的锁

signalAll()

唤醒全部等待在Condition上的线程,可以从await()等方法返回的线程必须先得到与Condition对象关联的锁

 

 

2 Lock

lock锁的相关概念:

可重入锁:可重入锁是指同一个线程能够屡次获取同一把锁。ReentrantLock和synchronized都是可重入锁。

可中断锁:可中断锁是指线程尝试获取锁的过程当中,是否能够响应中断。synchronized是不可中断锁,而ReentrantLock则提供了中断功能。

公平锁与非公平锁。公平锁是指多个线程同时尝试获取同一把锁时,获取锁的顺序按照线程达到的顺序,而非公平锁则容许线程“插队”,ReentrantLock的默认实现是非公平锁,可是也能够设置为公平锁。

CAS操做(CompareAndSwap):CAS操做简单的说就是比较并交换。CAS 操做包含三个操做数 —— 内存位置(V)、预期原值(A)和新值(B)。若是内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。不然,处理器不作任何操做。不管哪一种状况,它都会在 CAS 指令以前返回该位置的值。CAS 有效地说明了“我认为位置 V 应该包含值 A;若是包含该值,则将 B 放到这个位置;不然,不要更改该位置,只告诉我这个位置如今的值便可。” Java并发包(java.util.concurrent)中大量使用了CAS操做,涉及到并发的地方都调用了sun.misc.Unsafe类方法进行CAS操做。

2.1 ReentrantLock

ReentrantLock是Lock的默认实现之一,须要lock和realse,若是忘记释放锁就会产生死锁的问题,一般须要在finally中进行锁的释放。

synchronized锁的粒度控制比较粗,同时对于实现一些锁的状态的转移比较困难锁的粒度控制比较粗,同时对于实现一些锁的状态的转移比较困难。

tips

synchronized

Lock

锁获取超时

不支持

支持

获取锁响应中断

不支持

支持

 

核心类AbstractQueuedSynchronizer,经过构造一个基于阻塞的CLH队列容纳全部的阻塞线程,而对该队列的操做均经过Lock-Free(CAS)操做。

 

2.2 ReentrantReadWriteLock

ReentrantReadWriteLock是Lock的另外一种实现方式,咱们已经知道了ReentrantLock是一个排他锁,同一时间只容许一个线程访问,而ReentrantReadWriteLock容许多个读线程同时访问,但不容许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提升了并发性。在实际应用中,大部分状况下对共享数据(如缓存)的访问都是读操做远多于写操做,这时ReentrantReadWriteLock可以提供比排他锁更好的并发性和吞吐量

3 Semaphere

Semaphore是一种在多线程环境下使用的设施,该设施负责协调各个线程,以保证它们可以正确、合理的使用公共资源的设施,也是操做系统中用于控制进程同步互斥的量。Semaphore是一种计数信号量,用于管理一组资源,内部是基于AQS的共享模式。它至关于给线程规定一个量从而控制容许活动的线程数。

4 CyclicBarrier

栅栏CyclicBarrier容许两个或者多个线程在某个集合点同步。当一个线程到达集合点时,它将调用await()方法等待其它的线程。线程调用await()方法后,CyclicBarrier将阻塞这个线程并将它置入休眠状态等待其它线程的到来。等最后一个线程调用await()方法时,CyclicBarrier将唤醒全部等待的线程而后这些线程将继续执行。

5 CountDownLatch

     CountDownLatch能够把它看做一个计数器,只不过这个计数器的操做是原子操做,同时只能有一个线程去操做这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。你能够向CountDownLatch对象设置一个初始的数字做为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其余的线程减为0为止。

      很是典型的应用场景是:有一个任务想要往下执行,但必需要等到其余的任务执行完毕后才能够继续往下执行。假如咱们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其余的任务执行完本身的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止

6 Exchanger

用于线程间数据的交换。它提供一个同步点,在这个同步点,两个线程能够交换彼此的数据。这两个线程经过exchange方法交换数据,若是第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就能够交换数据,将本线程生产出来的数据传递给对方。Exchanger 可被视为 SynchronousQueue 的双向形式。

可简单地将Exchanger对象理解为一个包含两个格子的容器,经过exchanger方法能够向两个格子中填充信息。当两个格子中的均被填充时,该对象会自动将两个格子的信息交换,而后返回给线程,从而实现两个线程的信息交换。

相关文章
相关标签/搜索