标签:
一、科普定义
这篇博文的两个主角“synchronized”和“读写锁”
1)synchronized
这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用,在这就不多说只做几点归纳:
2)读写锁
我们对数据的操作无非两种:“读”和“写”,试想一个这样的情景,当十个线程同时读取某个数据时,这个操作应不应该加同步。答案是没必要的。只有以下两种情况需要加同步:
所以
二.用一道面试题来具体比较这两点
1
2
3
4
5
6
7
8
|
public synchronized Object getData(String key){ Object result = map.get(key); if (result == null ){ result = "new" ; //用这步代替访问数据库得数据 } return result; } |
用读写锁实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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; } |
代码分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class CachedData { Object data; volatile boolean cacheValid; ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { rwl.readLock().lock(); <span style= "color: #ff0000;" > if (!cacheValid)</span> { // 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. <span style= "color: #ff0000;" > if (!cacheValid)</span> { 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(); } } |
标签:
原文地址:http://www.cnblogs.com/jxrichar/p/5744894.html