1 package com.aj.thread;
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import java.util.concurrent.locks.ReadWriteLock;
6 import java.util.concurrent.locks.ReentrantReadWriteLock;
7
8 /**
9 * 利用读写锁设计一个缓存系统
10 *
11 * @author yaolei
12 *
13 */
14 public class CacheSystem {
15
16 private Map<String, Object> cacheData = new HashMap<String, Object>();// 缓存map
17
18 private ReadWriteLock rwl = new ReentrantReadWriteLock();// 新建读写锁对象
19
20 // 通过key来获取map中的数据,如果map中有数据直接从map取数据,否则从数据库中取数据,然后存放map中
21 public Object getCacheData(String key) {
22 // 上读锁,多个线程可以并发读
23 rwl.readLock().lock();
24 Object value = null;
25 try {
26 value = cacheData.get(key);
27 if (value == null) {// 如果缓存map中没数据,则需要写数据
28 // 释放读锁
29 rwl.readLock().unlock();
30 // 准备写数据了,上写锁
31 rwl.writeLock().lock();
32 try {
33 // 写数据
34 if (value == null) {//由于第一次进来读的时候可能有多个线程,当第一线程释放写锁的时候,另外的线程会再进来写,为保证只有第一个线程进来写的时候才会从数据库中查数据所以加这个判断
35 value = "从数据库中查询到的数据";
36 // 存到缓存map中
37 cacheData.put(key, value);
38 }
39
40 } finally {
41 rwl.writeLock().unlock();
42 }
43 // 再一次上读锁因为最终要释放读锁
44 rwl.readLock().lock();
45 }
46 } finally {// try起来,即使出现异常也会最终释放读锁
47 // 释放读锁
48 rwl.readLock().unlock();
49 }
50 return value;
51 }
52
53 //测试
54 public static void main(String[] args) {
55 CacheSystem c = new CacheSystem();
56 Object obj = c.getCacheData("yaolei");
57 System.out.println(obj);
58
59 }
60 }