黑马程序员 – 学习Java5线程并发库(5) -- 2013.1.3
来源:互联网 发布:淘宝卖高仿鞋的店铺 编辑:程序博客网 时间:2024/05/18 21:05
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
今天学习了锁,Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似。接触到读写锁,分为读锁和写锁,多个读锁不互斥,读锁和写锁互斥,写锁与写锁互斥。
读写锁的一个应用:设计一个缓存系统
下面是我按照老师的思路写的代码:
packagecn.itcast;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.concurrent.locks.ReadWriteLock;
importjava.util.concurrent.locks.ReentrantReadWriteLock;
/*
* 读写锁的应用:设计一个缓存系统
* 多个线程读不互斥,但是读写互斥,写写互斥
*/
publicclass CacheDemo {
private Map<String, Object> cacheData= new HashMap<String, Object>();
public static void main(String[] args) {
}
private Object value = null;
private ReadWriteLock rwl = newReentrantReadWriteLock();
public Object getData(String key){
rwl.readLock().lock();
try {
value = cacheData.get(key);
if(value == null){
rwl.readLock().unlock();
rwl.writeLock().lock();
try{
if(value==null) //重复检查value状态,因为可能多个线程会访问到此处。
value ="aaa"; //实际去queryDB
} finally {
rwl.readLock().lock();
rwl.writeLock().unlock(); //在释放写锁之前上读锁
}
}
} finally {
rwl.readLock().unlock();
}
return value;
}
}
接触到Condition,condition的功能类似在传统线程技术中的Object.wait和Object.notify的功能。不同的是一个锁内部可以有多个condition。JDK condition文档中有一个实现阻塞队列的例子,里面就使用了多个condition。
多个condition的另一个应用:实现三个线程轮流执行(通信)。即让主线程先运行,子线程1接着运行,然后子线程2运行。这里就不附加代码了。
学习了Semaphore同步工具和CyclicBarrier同步工具。使用Semaphore可以控制同时访问资源的线程个数。单个Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了锁,再由另一个线程来释放锁,可应用于恢复死锁的一些场合。CyclicBarrier表示大家彼此等待,大家集合好了后才开始出发,分散活动后又在指定地点集合碰面。
- 黑马程序员 – 学习Java5线程并发库(5) -- 2013.1.3
- 黑马程序员 – 学习Java5线程并发库(7) -- 2013.1.5
- 黑马程序员 – 学习Java5线程并发库(7) -- 2013.1.5
- 黑马程序员 – 学习Java5线程并发库(7) -- 2013.1.5
- 黑马程序员 – 学习Java5线程并发库(3) -- 2013.1.1
- 黑马程序员 – 学习Java5线程并发库(4) -- 2013.1.2
- 黑马程序员 – 学习Java5线程并发库(6) -- 2013.1.4
- 黑马程序员——Java5中的线程并发库(一)---概述、线程池、Callable和Future、Lock和Condition
- Java5 并发线程学习
- 黑马程序员:Java基础总结----线程池及java5的线程并发库
- java5线程并发库学习之Semaphore
- java5线程并发库学习之Semaphore
- java5线程并发库
- java5 线程并发库
- 黑马程序员——Java5中的线程并发库(二)--Semaphore实现信号灯、其他同步函数、可阻塞的队列、同步集合
- 黑马程序员---线程并发库
- 黑马程序员Java学习笔记之多线程(并发)
- 黑马程序员 – 学习Java5中的多线程(1) – 2012.10.29
- 安装vs2010找不到baseline数据
- 软件随想录:程序员部落酋长Joel谈软件(阮一峰译)-6
- 黑马程序员 – 学习Java5线程并发库(4) -- 2013.1.2
- 抛物样条曲线
- 幽默
- 黑马程序员 – 学习Java5线程并发库(5) -- 2013.1.3
- SQL/LINQ/Lambda 转换
- 通知activity 的方式
- 华为历史的几次重大管理变革
- 《怪诞行为学》零成本的成本
- 12306抢票插件拖垮GitHub网站
- JSP中使用taglib出错终极解决办法
- 黑马程序员 – 学习Java5线程并发库(6) -- 2013.1.4
- shell脚本文件参数