import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Created by chengtao on 17/12/5.
* Lock 是替代 sycronized 的,而且sycronized无法实现读写锁
*/ public class Thread1201_ReadWriteLock {
public static void main(String[] args) {
final Queue3 q3 = new Queue3();
for(int i=0;i<30;i++)
{
new Thread(){
public void run(){
while(true){
q3.get();
}
} }.start(); new Thread(){
public void run(){
while(true){
q3.put(new Random().nextInt(10000));
}
} }.start();
} }
} class Queue3{
private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
ReadWriteLock rwl = new ReentrantReadWriteLock();
public void get(){
rwl.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " 准备去读 ----- 数据!");
Thread.sleep((long)(Math.random()*10));
System.out.println(Thread.currentThread().getName() + " 已经读到 ----- 数据 :" + data);
System.out.println();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
rwl.readLock().unlock();
}
} public void put(Object data){ rwl.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " 准备去写数据 !");
Thread.sleep((long)(Math.random()*1000));
this.data = data;
System.out.println(Thread.currentThread().getName() + " 已经写入数据 : " + data);
System.out.println();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
rwl.writeLock().unlock();
} }
}
------------------------
------------------------
------------------------
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; /**
* Created by chengtao on 17/12/5.
*/
public class Thread1202_ReadWriteLock_Cache {
private Map<String, Object> cache = new HashMap<String, Object>();
public static void main(String[] args) { } //读写锁在缓存中的应用
private ReadWriteLock rwl = new ReentrantReadWriteLock();
public Object getData(String key){
rwl.readLock().lock();
Object value = null;
try{
value = cache.get(key);
if(value == null){
rwl.readLock().unlock();
rwl.writeLock().lock();
try{
if(value==null){
value = "aaaa";//实际失去queryDB();
}
}finally{
rwl.writeLock().unlock();
}
rwl.readLock().lock();
}
}finally{
rwl.readLock().unlock();
}
return value;
}
}
 

最新文章

  1. git push不用重复输入用户名和密码(解决方案)
  2. java中的System类
  3. 浅析mongodb中group分组
  4. 使用GitHub for Windows客户端管理京东代码库项目
  5. docker学习(一)
  6. 使用AnkhSvn-2.5.12478.msi管理vs2013代码的工具安装步骤使用
  7. 【Python】python读取文件操作mysql
  8. [Hive - LanguageManual] Archiving for File Count Reduction
  9. windows azure tools for mac
  10. Android 快捷方式
  11. UITextField 对输入金额的约束
  12. Android开发之自定义圆角矩形图片ImageView的实现 - Jamy Cai
  13. JS isArray记录
  14. vsftpd 安装
  15. es6的对象新增的方法
  16. c#Socket Tcp服务端编程
  17. php源码学习——开篇
  18. 升级版updateOozie.sh
  19. Alpha冲刺 - (3/10)
  20. PostgreSQL内部结构与源代码研究索引页

热门文章

  1. Entity Framework(三):使用特性(数据注解)创建表结构
  2. 关于JQueryMobile中Slider的一点研究
  3. trim() 是什么意思?
  4. Python安装相关的机器学习库以及图像处理库
  5. java的开发主要以http为基础
  6. 【BZOJ】1004: [HNOI2008]Cards(置换群+polya+burnside)
  7. 自动化测试的组成部分:SEARCH
  8. 解析IE, FireFox, Opera 浏览器支持Alpha透明的方法
  9. asp.net 动态添加多个用户控件
  10. @Override错误