利用读写锁写一个缓存系统
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.}
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.}