读书人

Java多线程(10)之ReentrantReadWrit

发布时间: 2013-08-13 16:43:28 作者: rapoo

Java多线程(十)之ReentrantReadWriteLock深入分析(转)
一、ReentrantReadWriteLock与ReentrantLock?

?

? 说到ReentrantReadWriteLock,首先要做的是与ReentrantLock划清界限。它和后者都是单独的实现,彼此之间没有继承或实现的关系。

ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念。前面的章节中一直在强调这个特点。显然这个特点在一定 程度上面减低了吞吐量,实际上独占锁是一种保守的锁策略,在这种情况下任何“读/读”,“写/读”,“写/写”操作都不能同时发生。但是同样需要强调的一 个概念是,锁是有一定的开销的,当并发比较大的时候,锁的开销就比较客观了。所以如果可能的话就尽量少用锁,非要用锁的话就尝试看能否改造为读写锁。

ReadWriteLock?描述的是:一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。也就是说读写锁使用的场合是一个共享资源被大量读取操作,而只有少量的写操作(修改数据)。清单0描述了ReadWriteLock的API。

?

清单0 ReadWriteLock 接口

[java] view plaincopy
  1. public?interface?ReadWriteLock?{??????Lock?readLock();??
  2. ????Lock?writeLock();??}??

清 单0描述的ReadWriteLock结构,这里需要说明的是ReadWriteLock并不是Lock的子接口,只不过ReadWriteLock借助 Lock来实现读写两个视角。在ReadWriteLock中每次读取共享数据就需要读取锁,当需要修改共享数据时就需要写入锁。看起来好像是两个锁,但 其实不尽然,下文会指出。

?

二、ReentrantReadWriteLock的特性

ReentrantReadWriteLock有以下几个特性:

读书人网 >编程

热点推荐