歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java中讀寫鎖的實現及使用讀寫鎖簡單實現緩存系統的實例

Java中讀寫鎖的實現及使用讀寫鎖簡單實現緩存系統的實例

日期:2017/3/1 10:34:33   编辑:Linux編程

讀寫鎖是線程讀寫同一文件所需要用到的,讀寫鎖是什麼東西在這裡不做過多的解釋,可以自己去百度或谷歌去搜一下。

謹在此附上我自己寫的緩存系統的簡單實現,你從中也能悟出緩存實現的基本思想

緩存裡面有數據就從緩存中取,沒有就給你從其他地方得到。

[java]
  1. package cn.com.scl.cache
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.concurrent.locks.ReadWriteLock;
  5. import java.util.concurrent.locks.ReentrantReadWriteLock;
  6. /**
  7. * 緩存的實現,每個線程只能獲得他自己的緩存,也應該是單例的
  8. * 本類沒有去實現單例,如果需要的話可以自行去實現
  9. * @author scl
  10. *
  11. */
  12. public class CacheSystem {
  13. private Map<String, Object> cache = new HashMap<String,Object>();
  14. private ReadWriteLock rwl = new ReentrantReadWriteLock();
  15. public Object getData(String key){
  16. //先從緩存中去取數據,先加上讀鎖
  17. rwl.readLock().lock();
  18. Object obj = null;
  19. try{
  20. obj = cache.get(key);
  21. if(obj == null){
  22. //先解除讀鎖,在上寫鎖(必須先解除讀鎖才能成功上寫鎖)
  23. rwl.readLock().unlock();
  24. rwl.writeLock().lock();
  25. //去數據庫取數據,再判斷一次是否為null,因為有可能多個線程獲得寫鎖
  26. try{
  27. if(obj == null){
  28. obj = new String("obj is get from db");
  29. }
  30. }finally{
  31. //先上讀鎖,然後再解除寫鎖(這樣可以成功完成,在解除寫鎖前獲得讀鎖,寫鎖被降級--這翻譯的api上的)
  32. rwl.readLock().lock();
  33. rwl.writeLock().unlock();//解除寫鎖,讀鎖仍然持有
  34. }
  35. }
  36. }finally{
  37. rwl.readLock().unlock();
  38. }
  39. return obj;
  40. }
  41. }
Copyright © Linux教程網 All Rights Reserved