赞
踩
说到Java并发编程,很多开发第一个想到同时也是经常常用的肯定是Synchronized,但是Synchronized存在明显的一个性能问题就是读与读之间互斥,简言之就是,我们编程想要实现的最好效果是,可以做到读和读互不影响,读和写互斥,写和写互斥,提高读写的效率,这就要用到本章的重点ReadWriteLock读写锁。
之前文章已经介绍了Lock的一种实现ReentrantLock的使用,其在功能上和Synchronized相同,只不过这个更具灵活性。而本章介绍的ReadWriteLock也是Lock的一种实现,而且相对于ReentrantLock和Synchronized,ReadWriteLock在性能上更具优势。
Java并发包中ReadWriteLock是一个接口,主要有两个方法,如下:
- public interface ReadWriteLock {
- /**
- * Returns the lock used for reading.
- *
- * @return the lock used for reading
- */
- Lock readLock();
-
- /**
- * Returns the lock used for writing.
- *
- * @return the lock used for writing
- */
- Lock writeLock();
- }
ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。
Java并发库中ReetrantReadWriteLock实现了ReadWriteLock接口并添加了可重入的特性。
在具体讲解ReetrantReadWriteLock的使用方法前,我们有必要先对其几个特性进行一些深入学习了解。
什么是可重入锁,不可重入锁呢?"重入"字面意思已经很明显了,就是可以重新进入。可重入锁,就是说一个线程在获取某个锁后,还可以继续获取该锁,即允许一个线程多次获取同一个锁。比如synchronized内置锁就是可重入的,如果A类有2个synchornized方法method1和method2,那么method1调用method2是允许的。显然重入锁给编程带来了极大的方便。假如内置锁不是可重入的,那么导致的问题是:1个类的synchornized方法不能调用本类其他synchornized方法,也不能调用父类中的synchornized方法。与内置锁对应,JDK提供的显示锁ReentrantLock也是可以重入的,这里通过一个例子着重说下可重入锁的释放需要的事儿。
- public class Test1 {
-
- public static void main(String[] args) throws InterruptedException {
- final ReentrantReadWriteLock lock = new ReentrantReadWriteLock ();
- Thread t = new Thread(new Runnable() {
- @Override
- public void run() {
- lock.writeLock().lock();
- System.out.println("Thread real execute");
- lock.writeLoc
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。