赞
踩
日常记录
1.6文档解释:
ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。
所有 ReadWriteLock 实现都必须保证 writeLock 操作的内存同步效果也要保持与相关 readLock 的联系。也就是说,成功获取读锁的线程会看到写入锁之前版本所做的所有更新。
尽管读-写锁的基本操作是直截了当的,但实现仍然必须作出许多决策,这些决策可能会影响给定应用程序中读-写锁的效果。这些策略的例子包括:
方法
import java.util.HashMap; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 读取锁:ReaderWriterLock * 文档: * ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。 * 只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。 * 所有 ReadWriteLock 实现都必须保证 writeLock 操作的内存同步效果也要保持与相关 readLock 的联系。 * 也就是说,成功获取读锁的线程会看到写入锁之前版本所做的所有更新。 * 解释:防止,在多线程下,读写顺序混乱 * 缺点: * 写数据时,一次,只允许一个线程写,但是允许多个线程读。 * 读数据时,允许多个线程读,但是不允许线程写数据,只有读取完了,才能写数据 * 原因:出现写锁的降级,为读锁(写锁可以降级,读锁读锁不可以) * 写锁降级顺序: * 获取写锁----》获取读锁----》释放写锁-----》释放读锁 * */ public class ReentrantReadWriterLockUse { //模拟缓存 private static volatile HashMap mp= new HashMap<String,Object>(); //读写锁可重入锁,解决多线程情况下,读写顺序情况 private static ReadWriteLock rwLock=new ReentrantReadWriteLock(); /** * 写方法 * @param key * @param value */ public static void writer(String key,Object value){ rwLock.writeLock().lock(); //添加写锁 try { //每个写入线程,睡眠0.5秒 TimeUnit.MILLISECONDS.sleep(10); mp.put(key,value); System.out.println("正在写入:第"+key+"个值:"+value); } catch (InterruptedException e) { e.printStackTrace(); }finally { //释放写锁 rwLock.writeLock().unlock(); } } /** * 读方法 * @param key * @return */ public static Object read(String key){ try { //添加读锁 rwLock.readLock().lock(); //每个写入线程,睡眠0.5秒 TimeUnit.MILLISECONDS.sleep(10); Object result = mp.get(String.valueOf(key)); System.out.println("------正在读取:第"+result+"个值:"+result.toString()); return result; } catch (InterruptedException e) { e.printStackTrace(); return "读取失败"; }finally { //释放读锁 rwLock.readLock().unlock(); } } public static void main(String[] args) { for (int i = 1; i <=5 ; i++) { final int num=i; new Thread(()->{ writer("key"+num,num); System.out.println("数据--写入完成:"+" key:"+num+" value:"+num); }).start(); } for (int i = 1; i <=5 ; i++) { final int num=i; new Thread(()->{ Object read =read("key" + num); System.out.println("数据--读取完成:"+read.toString()); }).start(); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。