使用Java设计一个 高可用、高效率的缓存系统
2014-09-04 01:09
633 查看
package concurrent; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * <pre> * @author: bing * @date: 2014年9月3日 下午4:30:28 * @company: --- * @version: 1.0 * @Mail: * * 缓存小系统设计 * </pre> * */ public class L2_CacheDemo { public static void main(String[] args) throws InterruptedException { final CacheData cacheData = new CacheData(); for (int i = 0; i < 3; i++) { new Thread(new Runnable() { public void run() { try { System.out.println("返回值 --->" + cacheData.getData("name")); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } Thread.sleep(3000); System.out.println("------------------------------------------"); for (int i = 0; i < 3; i++) { new Thread(new Runnable() { public void run() { try { System.out.println("value --->" + cacheData.getData("name")); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } } } class CacheData { private static Map<String, Object> cache = new HashMap<String, Object>(); /** * 读写锁:分为读锁和写锁,读和读不互斥,读和写互斥,写和写互斥。 */ // 只需一把锁,该锁的性质会变 private ReadWriteLock rwl = new ReentrantReadWriteLock(); /** * <pre> * 体会:多个线程调用同一个函数进行运算、就相当于 多个学生都在自己的作业本上做相同的题目、互不干涉、除非有共用的文具(共享数据 )、 如:共用一把尺子。 * </pre> */ public Object getData(String key) throws InterruptedException { System.out.println(Thread.currentThread().getName() + "进来了..."); rwl.readLock().lock();// 上读锁、注意:该锁的属性会改变、如:变成写锁 System.out.println(Thread.currentThread().getName() + "跨越了第一道锁..."); Object data = null; try { data = cache.get(key); if (data == null) { rwl.readLock().unlock();// 解读锁 // -----------换锁---------------------- rwl.writeLock().lock();// 上写锁 System.out.println(Thread.currentThread().getName() + "上了写锁...缓存为:" + cache); try { // 注意:这里的 cache.get(key)、不能换成 data、data为局部变量 if (cache.get(key) == null) { System.out.println(Thread.currentThread().getName() + "准备写入数据...value=" + data); data = "小李";// 真实业务-》查询数据库 cache.put(key, data); } } finally { rwl.writeLock().unlock();// 解写锁 } // --------------------------------- rwl.readLock().lock();// 上读锁 ,即:写完以后就赶紧换锁 System.out.println(Thread.currentThread().getName() + "换了读锁..."); } } finally { rwl.readLock().unlock();// 解读锁 System.out.println(Thread.currentThread().getName() + "出去了..."); } <span style="white-space:pre"> </span>return cache.get(key);// 不能使用data 代替 cache.get(key)、因为data可能为空。 } }
相关文章推荐
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
- 线程中如何创建锁和使用锁 Lock,设计一个缓存系统
- java 使用读写锁设计一个缓存模型
- 设计一个缓存系统 java多线程读写锁的应用
- 使用java或C++,设计一个画图板(类似于windows系统自带的画图工具)。
- 使用JAVA语言编程,数据库使用SQL server制作一个图书销售系统
- 使用 Java 缓存系统缓存频繁查看的数据
- 页面静态化3 --- 使用PHP页面缓存机制来完成页面静态化(下)操作一个案例(新闻管理系统)
- 性能优化(一个)Hibernate 使用缓存(一个、两、查询)提高系统性能
- 使用java判断一个地址是否可用的两种方式
- 关于一个Java帮助系统的设计
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 如何使用bloomfilter构建大型Java缓存系统
- 游戏服务端中使用Servlet和Java注解的一个好设计
- Java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- 如何使用bloomfilter构建大型Java缓存系统
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- 设计一个如下图所示窗体:该窗体自动位于屏幕中央;大小不可调;最小化、最大化按钮不可用;窗体标题为“烟台大学”。在该窗体上,放置一个按钮、一个标签。单击按钮时,在标签上显示当前系统时间。
- android学习笔记---53_采用网页设计软件界面,以及使用android系统内置的浏览器,利用js调用java方法
- 使用java的GUI设计一个简单的登陆界面(1)