一、科普定义
这篇博文的两个主角“synchronized”和“读写锁”
1)synchronized
这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用,在这就不多说只做几点归纳:
2)读写锁
我们对数据的操作无非两种:“读”和“写”,试想一个这样的情景,当十个线程同时读取某个数据时,这个操作应不应该加同步。答案是没必要的。只有以下两种情况需要加同步:
所以
java5提供了读写锁 这种锁支持多线程读操作不互斥,多线程读写互斥,多线程写写互斥。 读操作不互斥这样有助于性能的提高,这点在java5以前没有 二.用一道面试题来具体比较这两点 题目:“白板编程,实现一个缓存系统” 题目分析: 对这个缓存系统的理解: 间于用户和数据库中间的一个环节,我们知道用户直接访问数据库的时间是远大于直接访问内存,所以有了缓存区后用户访问数据时?这样,用户先访问缓存区当缓存区有用户需要的数据时直接拿走,当缓存区没有这样的数据,访问数据库并把访问所得的数据放在缓存区,这样当下一个需要这个数据的用户就直接访问内存即可得到。 核心代码实现: 首先用synchronized实现class="java" name="code">public synchronized Object getData(String key){
Object result = map.get(key);
if(result ==null){
result = "new";//用这步代替访问数据库得数据
}
return result;
}
?用读写锁实现
public Object getData(String key){
rw.readLock().lock();//在读前先上读锁
Object result = null;
try{
result = map.get(key);
//这个if比较关键,它避免了多余的几次对数据哭的读取
if(result==null){
//如果内存中没有所要数据
rw.readLock().unlock();
rw.writeLock().lock();
if(result==null){
try{
//我们用这个代替对数据库访问得到数据的步骤
result = "new";
}finally{
rw.writeLock().unlock();
}
rw.readLock().lock();
}
}
}finally{
rw.readLock().unlock();
}
return result;
}
?代码分析:
class CachedData {
Object data;
volatile boolean cacheValid;
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
// Recheck state because another thread might have acquired
// write lock and changed state before we did.
if (!cacheValid) {
data = ...
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();
rwl.writeLock().unlock(); // Unlock write, still hold read
}
use(data);
rwl.readLock().unlock();
}
}
?学习在继续!!!Go!Go!Go!!!
?
??
?