小结java自带的跟锁相关的一些类
java.util.concurrent包下的一些跟锁相关的类列表
类 | 简介 | ||||||||||||||||||||||||||||||||||||||||||||
locks.Lock接口 |
Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。 所有已知实现类:ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock 方法包括:
|
||||||||||||||||||||||||||||||||||||||||||||
locks.ReentrantLock类 |
public class ReentrantLock extends Object implements Lock, Serializable 一个可重入的互斥锁 可以实现公平锁,默认为非公平锁。 构造函数:
常用方法: Lock接口上定义的那些方法 + 下面表中的查询方法
|
||||||||||||||||||||||||||||||||||||||||||||
locks.ReadWriteLock接口 |
ReadWriteLock 维护了一对相关的 所有已知实现类:locks.ReentrantReadWriteLock
|
||||||||||||||||||||||||||||||||||||||||||||
locks. ReentrantReadWriteLock 类 |
public class ReentrantReadWriteLock extends Object implements ReadWriteLock, Serializable 该类有如下几个特点: 1、默认为非公平锁模式,可以调用有参的构造函数构建公平锁。 2、可重入: 此锁允许 reader 和 writer 按照 ReentrantLock 的样式重新获取读取锁或写入锁。在写入线程保持的所有写入锁都已经释放后,才允许重入 reader 使用它们。
此外,writer 可以获取读取锁,但反过来则不成立。在其他应用程序中,当在调用或回调那些在读取锁状态下执行读取操作的方法期间保持写入锁时,重入很有用。如果 reader 试图获取写入锁,那么将永远不会获得成功。
3、锁降级:允许从写入锁降级为读取锁,其实现方式是:先获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不可能的。 示例: class CachedData { Object data; volatile boolean cacheValid; ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { rwl.readLock().lock(); if (!cacheValid) { // Must release read lock before acquiring write lock rwl.readLock().unlock(); rwl.writeLock().lock(); // Recheck state because another thread might have acquired // write lock and changed state before we did. if (!cacheValid) { data = ... cacheValid = true; } // Downgrade by acquiring read lock before releasing write lock rwl.readLock().lock(); rwl.writeLock().unlock(); // Unlock write, still hold read } use(data); rwl.readLock().unlock(); } } 4、锁获取可中断:读取锁和写入锁都支持锁获取期间的中断。 5、写锁Condition支持,但读锁不支持Condition。 注意事项:此锁最多支持 65535 个递归写入锁和 65535 个读取锁。试图超出这些限制将导致锁方法抛出 Error。 构造函数:
嵌套类:
主要的方法有:
|
||||||||||||||||||||||||||||||||||||||||||||
CountDownLatch类 |
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。该类为一次性的锁,不可重用。 构造函数: 方法包括:
|
||||||||||||||||||||||||||||||||||||||||||||
CyclicBarrier类 |
一个同步辅助类,它允许一组线程互相等待(调用await),当等待的线程数达到构造函数中int parties(屏障)的数量时才线程组里的线程才能继续往下执行/退出,同时它有一个带Runnable入参的构造函数允许在线程组突破这个屏障后(但在释放所有线程之前)执行相关的Runnable的代码(也就是最后一个达成突破屏障的那个线程达到后)。该类可重用。 通俗点讲:在hadoop等map/reduce分布式计算框架中里有用到这种思想,将一个任务拆成多个子任务,然后最后一子任务完成后整个任务才能继续往下执行(汇总各个子任务的结果)。 构造函数:
方法列表:
|
||||||||||||||||||||||||||||||||||||||||||||
Semaphore类 |
一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 通俗的讲就是:一个令牌池,通过acquire()方法获取一个令牌,如果没获取到就等待,获取到了就继续执行,执行完毕通常需要调用release()方法归还令牌,当归还的时候回唤醒正在等待获取令牌的线程来争取这个令牌。 该类默认为非公平锁,但有公平锁的构造函数可选。 构造函数:
方法列表:
|