利用读写锁写一个缓存系统

利用读写锁写一个缓存系统

01.import java.util.HashMap; 
02.import java.util.Map; 
03.import java.util.concurrent.locks.ReadWriteLock; 
04.import java.util.concurrent.locks.ReentrantReadWriteLock; 
05. 
06./**
07. * 利用读写锁写一个缓存系统
08. * @author 谭飞
09. * @date 2012-02-03
10. */ 
11.public class CacheDemo { 
12. 
13.    private Map<String, Object> cache = new HashMap<String, Object>(); //用于存放缓存的数据集 
14.     
15.    /**
16.     * @param args
17.     */ 
18.    public static void main(String[] args) { 
19.        CacheDemo demo = new CacheDemo(); 
20.        //demo.cache.put("3", 123456); 
21.        System.out.println("返回的值:" + demo.getCache2("3")); 
22.    } 
23.     
24.    /*利用synchronized同步,但是有缺陷,当是很多线程读取数据时不应该用,
25.     * 因为这样会降低效率,最好用读写锁来控制*/ 
26.    public synchronized Object getCache1(String key) 
27.    { 
28.        Object value = null; 
29.        value = cache.get(key); 
30.        if(value == null) 
31.        { 
32.            //查询数据操作 此处省略 
33.            value = "数据库取得的值"; 
34.        } 
35.        return value; 
36.    } 
37.     
38.    private ReadWriteLock rwl = new ReentrantReadWriteLock();//创建读写锁 
39.     
40.    /*利用读写锁来控制多个线程的读写操作*/ 
41.    public Object getCache2(String key) 
42.    { 
43.        rwl.readLock().lock();//打开读锁 
44.        Object value = null; 
45.        try 
46.        { 
47.            value = cache.get(key); 
48.            if(value == null) 
49.            { 
50.                rwl.readLock().unlock();//关闭读锁 
51.                rwl.writeLock().lock();//打开写锁 
52.                try 
53.                { 
54.                    if(value == null)//再次检测该值是否为null,因为在多个线程访问的时候,写数据的时候会把其它写的线程堵在外面,一旦写完后,这个value存在值了就不用再去查询数据库了,以此来提高系统的效率 
55.                    { 
56.                        //查询数据操作 此处省略 
57.                        value = "数据库取得的值"; 
58.                    } 
59.                }finally 
60.                { 
61.                    rwl.writeLock().unlock();//关闭写锁 
62.                } 
63.                rwl.readLock().lock();//打开读锁 
64.            } 
65.        }finally 
66.        { 
67.            rwl.readLock().unlock();//关闭读锁 
68.        } 
69.        return value; 
70.    } 
71. 
72.} 


你可能感兴趣的:(读写锁)