Java JUC 高级线程之十 读-写 锁 ReadWriteLock

版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/88937692

文章目录

ReadWriteLock

  1. ReadWriteLock维护了一对相关的锁,一个用于只读操作,一个用于写入操作。只要没有writer,读取锁可以由Reader线程同时保持,但写入锁是独占的。
  2. ReadWriteLock读取操作通常不会改变共享资源,但执行写入操作时,必须用独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock能提供比独占锁更高的并发性。而不是对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。
  3. 接口的JDK源码
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();
}
  1. demo
/*
 * 1. ReadWriteLock : 读写锁
 * 
 * 写写/读写 :需要“互斥”
 * 读读 不需要“互斥”
 */
public class TestReadWriteLock {
	public static void main(String[] args) {
		ReadWriteLockDemo rw = new ReadWriteLockDemo();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				rw.set((int) (Math.random()*101));
			}
		},"write:").start();
		
		for(int i = 0; i < 100; i ++ ) {
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					rw.get();
					
				}
			}).start();
		}
		
	}
}
class ReadWriteLockDemo{
	
	private int number = 0;
	private ReadWriteLock lock = new ReentrantReadWriteLock();
	//读取
	public void get() {
		lock.readLock().lock();
		try {
			System.out.println(Thread.currentThread().getName() + " : " + number);
		} finally {
			lock.readLock().unlock();
		}
	}
	
	//写入
	public void set(int number) {
		lock.writeLock().lock();
		try {
			System.out.println(Thread.currentThread().getName());
			this.number = number;	
		} finally {
			lock.writeLock().unlock();
		}
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34626097/article/details/88937692