JDK并发包——同步控制工具

2018-07-01  本文已影响0人  zhanghTK

title: JDK并发包——同步控制工具
date: 2017-04-09 21:46:11
tags:


为了弥补Java原生并发的各种不足,在并发包中提供了格式各样的工具,这篇先看看关于同步控制并法包的支持。

可重入锁——ReentrantLock

Java原生提供的synchronized主要有以下几个缺点:

可重入锁既是为了解决以上问题提出的。

但是关于这个可重入的名字我觉得还是比较让人疑惑,synchronized本身也是支持一个线程的重入的。

对于原生synchronized的缺陷,ReentrantLock提供了如下几个重要的方法以改善:

除此还提供了最基本的lock()方法:获得,如果锁被占用则等待。

ReentrantLock使用过程中需要注意的是无论何种方式获取锁,每次获取锁之后都要手动调用unlock方法释放锁。

wait/notify的替身——Condition

Condition与ReentrantLock的关系如同synchronized与wait/notify方法的关系。

为了配合ReentrantLock,Condition本身提供了与wait方法类似的await,与notif方法类似的singal,除此还补充了不响应中断的awaitUninterruptibly方法。

关于Condition的使用:

宽容的临界区——Semaphore

可以简单的理解信号量(Semaphore)是可以多个线程同时访问的临界区资源。

在构造Semapho时必须制定多个线程的具体数量,还可以指定是否是否公平访问,对象的其它主要方法有:

方法的含义如同方法名,没有发现使用特别的地方。

需要注意的是申请的信号量使用完毕后,需要release以避免资源越来越少。

读写锁——ReentrantReadWriteLock

说来惭愧,到目前为止在实际项目中并发包的各种工具我貌似只使用过读写锁。

通常锁都是严格串行的,读写锁提供读写分离锁,对多个读操作不进行阻塞,以此来改善性能。

具体使用中读锁和写锁需要从同一个ReentrantReadWriteLock对象获取:

ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Lock readLock = readWriteLock.readLock();
Lock writeLock = readWriteLock.writeLock();

针对读操作使用读锁,针对写操作使用写锁。

倒计数器与循环栅栏

倒计数器:CountDownLatch

循环栅栏:CyclicBarrier

这两个工具具体用法不好解释,我以一个场景考试举例,这个场景有如下特点:

使用倒计数器实现时:

使用循环栅栏实现时:

可以看出CyclicBarrier还是更强大一些的。

相较于CountDownLatch,CyclicBarrier可以定义完成事件,可以重复使用,控制线程的阻塞。


以上并发工具的使用示例都可以在Joolkit中找到。

上一篇下一篇

猜你喜欢

热点阅读