从零开始java多线程到分布式锁(十三):读写锁ReentrantReadWriteLock

一:读写锁的引入

  我们在实际项目中,即使在一些使用锁的方法下也是基本以读为主写为辅,那么在大多数的读的情况下,如果也是用排它锁(即一个线程获取到锁,其他线程就进入阻赛了)就会导致是项目效率降低。有没有这样这样一种锁,读锁是排它锁,写是共享锁。

  在java中提供这样一种锁:ReentrantReadWriteLock。该接口维护了一组共2个锁。其中读锁是共享锁,写锁是互斥锁。

 

二:读写锁

1.读读锁共享

package LockApi;


import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 读写锁 ReadWriteLock的互斥读锁
 * @author monxz
 *
 */
public class ReadAndWriterOnlyRead {
	
	private ReentrantReadWriteLock   lock =new ReentrantReadWriteLock();
	
	public void  readLock(){
		//加锁
		lock.readLock().lock();
		try {
			System.out.println("线程开始运行"+Thread.currentThread().getName());
			System.out.println("========读锁开始==========");
			Thread.sleep(1000);
			System.out.println("=======读锁结束===========");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			lock.readLock().unlock();
		}
	}
	

	public static void main(String[] args) {
		ReadAndWriterOnlyRead   lockService = new  ReadAndWriterOnlyRead();
		
		//模拟多线程
		for(int  i = 0 ; i < 5 ; i++ ){
			new Thread(new Runnable() {			
				@Override
				public void run() {					
					lockService.readLock();
				}
			}).start();
		}
		
	}
	
}

运行结果:可以看出后面线程并没有等前一个线程执行完成才执行。

从零开始java多线程到分布式锁(十三):读写锁ReentrantReadWriteLock_第1张图片

2.写写锁互斥

package LockApi;


import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 读写锁 ReadWriteLock的互斥读锁
 * @author monxz
 *
 */
public class ReadAndWriterOnlyRead {
	
	private ReentrantReadWriteLock   lock =new ReentrantReadWriteLock();
	
	public void  readLock(){
		//加锁
		lock.writeLock().lock();
		try {
			System.out.println("线程开始运行"+Thread.currentThread().getName());
			System.out.println("========写锁开始==========");
			Thread.sleep(1000);
			System.out.println("=======写锁结束===========");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			lock.writeLock().unlock();
		}
	}
	

	public static void main(String[] args) {
		ReadAndWriterOnlyRead   lockService = new  ReadAndWriterOnlyRead();
		
		//模拟多线程
		for(int  i = 0 ; i < 5 ; i++ ){
			new Thread(new Runnable() {			
				@Override
				public void run() {					
					lockService.readLock();
				}
			}).start();
		}
		
	}
	
}

 运行结果:每一个线程都是等前一个执行完毕。

从零开始java多线程到分布式锁(十三):读写锁ReentrantReadWriteLock_第2张图片

你可能感兴趣的:(从零开始)