----------- 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表示大家彼此等待,大家集合好了后才开始出发,分散活动后又在指定地点集合碰面。