java5读写锁技术的妙用
2018-01-17 00:00
141 查看
一、概述
读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!二、代码描述
1、ReadWriteLockTest.java
/** * @Title: ReadWriteLockTest.java * @Package com.lh.threadtest.t10 * @Description: TODO * @author Liu * @date 2018年1月17日 下午5:17:47 * @version V1.0 */ package com.lh.threadtest.t10; import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @ClassName: ReadWriteLockTest * @Description: TODO * @author Liu * @date 2018年1月17日 下午5:17:47 * */ public class ReadWriteLockTest { public static void main(String[] args) { final Queue3 q3 = new Queue3(); for(int i=0;i<3;i++) { new Thread(){ public void run(){ while(true){ q3.get(); } } }.start(); } for(int i=0;i<3;i++) { new Thread(){ public void run(){ while(true){ q3.put(new Random().nextInt(10000)); } } }.start(); } } } class Queue3{ private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。 private ReadWriteLock rwl = new ReentrantReadWriteLock(); public void get(){ rwl.readLock().lock(); try { System.out.println(Thread.currentThread().getName() + " be ready to read data!"); Thread.sleep((long)(Math.random()*1000)); System.out.println(Thread.currentThread().getName() + "have read data :" + data); } catch (InterruptedException e) { e.printStackTrace(); }finally { rwl.readLock().unlock(); } } public void put(Object data){ rwl.writeLock().lock(); try { System.out.println(Thread.currentThread().getName() + " be ready to write data!"); Thread.sleep((long)(Math.random()*1000)); this.data = data; System.out.println(Thread.currentThread().getName() + " have write data: " + data); } catch (InterruptedException e) { e.printStackTrace(); }finally { rwl.writeLock().unlock(); } } }
2、CachedDB.java
/** * @Title: CachedDB.java * @Package com.lh.threadtest.t10 * @Description: TODO * @author Liu * @date 2018年1月17日 下午6:12:33 * @version V1.0 */ package com.lh.threadtest.t10; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @ClassName: CachedDB * @Description: TODO * @author Liu * @date 2018年1月17日 下午6:12:33 * */ public class CachedDB { /*** * @Title: main * @Description: TODO * @param @param args * @return void * @throws */ public static void main(String[] args) { Business business = new Business(); for(int i = 1; i <= 3; i++){ for(int j = 1; j <= 3; j++){ final int target = j; new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " val: " + business.getAndSet(target + "")); } },"threadName-" + target).start(); } } } } class Business{ private static Map<String, Integer> cachedMap = new HashMap<>(); private ReadWriteLock rwl = new ReentrantReadWriteLock(); static{ cachedMap.put("xiaofang", 1); cachedMap.put("xiaobai", 2); cachedMap.put("xiaomei", 3); } public Integer getAndSet(String name){ rwl.readLock().lock(); Integer target = null; try { target = cachedMap.get(name); if(Objects.isNull(target)){ rwl.readLock().unlock(); rwl.writeLock().lock(); try { if(Objects.isNull(target)){ target = name.equals("1") ? 10 : (name.equals("2") ? 100 : 1000);//去查询数据库 cachedMap.put(name, target); } } finally { rwl.writeLock().unlock(); } rwl.readLock().lock(); //use... } } finally { rwl.readLock().unlock(); } return target; } }
三、读写锁API缓存demo
参考资料
1、java中ReentrantReadWriteLock读写锁的使用2、java并发编程系列之ReadWriteLock读写锁的使用
相关文章推荐
- 多线程12_张孝祥 java5读写锁技术的妙用
- java5读写锁技术的妙用(十二)
- Java5并发库之锁(二)——读写锁技术的妙用
- 12.Java5读写锁技术的妙用
- (9)java5的线程【锁lock】与【读写锁_以及模拟缓存(妙用)】技术
- 【Java多线程与并发库】10.java5的线程锁(读写锁)技术
- 11-java5读写锁技术
- (9)java5的线程【锁lock】与【读写锁_以及模拟缓存(妙用)】技术
- 【Java多线程与并发库】10.java5的线程锁(读写锁)技术
- 【张孝祥并发课程笔记】11:java5读写锁技术
- 从程序员到CTO的Java技术路线图
- Java技术简介及Tomcat部署
- 总结一些考察初级Java程序员技术能力的要点(转)
- JAVA技术实现上传下载文件到FTP服务器(完整)
- Java同步技术(九)
- NHibernate composite-id class must override Equals() 解决办法 分类: 技术心得(C#与JAVA) 2013-01-23 15:20 1289人阅
- 总结Java常用到的六个加密技术和代码
- java应用技术2
- JavaNativeAccess-----------一种方便的调用本地方法的技术