赞
踩
在jdk帮助文档中是这么说的:A ReadWriteLock维护一对关联的locks,一个用于只读操作,一个用于写操作。read lock可以由多个阅读器同时进行,只要没有作者 write lock 是独家的
意思就是读操作可以被多个线程同时读,写操作只能由一个线程去写
ReadWriteLock同Lock一样也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个是只读的锁,一个是写锁。ReentranReadWriteLock是其实现类。
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
- public interface ReadWriteLock {
-
- //返回读锁
- Lock readLock();
-
- //返回写锁
- Lock writeLock();
- }
- readWriteLock.writeLock().lock();
- readWriteLock.writeLock().unlock();
- readWriteLock.readLock().lock();
- readWriteLock.readLock().unlock();
读写锁的使用场景:在一些共享资源的读和写操作,且写操作没有读操作那么频繁的场景下可以用读写锁。
互斥原则:
- 读 - 读 ---> 可以共存(即可以用多个线程同时读取)
- 读 - 写 ---> 不能共存(即读的时候不能有其他线程去修改或写入,修改或写入的时候不能有其他线程去读)
- 写 - 写 ---> 不能共存(一个线程修改或写入的时候不能同时有其他线程写入或修改)
下面写一个不加锁的读写示例:
- public class ReadWriteLockDemo {
- public static void main(String[] args) {
- MyCache1 myCache = new MyCache1();
- //写入操做
- for (int i = 1; i <= 5; i++) {
- final String temp = i+" ";
- new Thread(()->{
- myCache.put(temp,temp);
- },String.valueOf(i)).start();
- }
-
- //读取操作
- for (int i = 1; i <= 5; i++) {
- final String temp = i+" ";
- new Thread(()->{
- myCache.get(temp);
- },String.valueOf(i)).start();
- }
-
- }
- }
- /*
- 自定义缓存
- */
- class MyCache1 {
- private volatile Map<String,Object> map = new HashMap<>();
- //存,写
- public void put(String key,Object value){
- System.out.println(Thread.currentThread().getName()+"写入"+key);
- map.put(key,value);
- System.out.println(Thread.currentThread().getName()+"写入成功"+key);
- }
- //取,读
- public void get(String key){
- System.out.println(Thread.currentThread().getName()+"读取"+key);
- Object o = map.get(key);
- System.out.println(Thread.currentThread().getName()+"读取成功"+o);
- }
- }
从运行结果可以看到,线程在执行写操作的时候,会存在被其他线程插队的现象。而加上读写锁就可以有效解决这一问题
- public class ReadWriteLockDemo {
- public static void main(String[] args) {
- MyCache myCache = new MyCache();
- //写入操做
- for (int i = 1; i <= 5; i++) {
- final String temp = i+" ";
- new Thread(()->{
- myCache.put(temp,temp);
- },String.valueOf(i)).start();
- }
-
- //读取操作
- for (int i = 1; i <= 5; i++) {
- final String temp = i+" ";
- new Thread(()->{
- myCache.get(temp);
- },String.valueOf(i)).start();
- }
-
- }
- }
- /*
- 自定义缓存 set get
- */
- class MyCache {
- private volatile Map<String,Object> map = new HashMap<>();
- ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
- //存,写
- public void put(String key,Object value){
- readWriteLock.writeLock().lock();
- try {
- System.out.println(Thread.currentThread().getName()+"写入"+key);
- map.put(key,value);
- System.out.println(Thread.currentThread().getName()+"写入成功"+key);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- readWriteLock.writeLock().unlock();
- }
- }
- //取,读
- public void get(String key){
- readWriteLock.readLock().lock();
- try {
- System.out.println(Thread.currentThread().getName()+"读取"+key);
- Object o = map.get(key);
- System.out.println(Thread.currentThread().getName()+"读取成功"+o);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- readWriteLock.readLock().unlock();
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。