基于synchronized 或 ReadWriteLock实现 简单缓存机制

  1 package cn.xxx.xxx;
  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 public class CacheDemo_My {
  9
 10     public static void main(String[] args) {
 11         // 内部类 实例化时需要在 内部类前加static 关键字
 12         final CacheClass cacheClass = new CacheClass();
 13         for (int i = 0; i < 10; i++) {
 14             new Thread(new Runnable() {
 15
 16                 @Override
 17                 public void run() {
 18                     Object valueObject = cacheClass.getData("1");
 19                     System.out.println(Thread.currentThread().getName() + " : " + valueObject);
 20                 }
 21             }).start();
 22         }
 23     }
 24
 25
 26     static class CacheClass {
 27         private Map<String, Object> cacheMap = new HashMap<String, Object>();
 28
 29         /**
 30          * 1.0 没有考虑并发 问题: 从数据库查了两次
 31          * 从数据库查询数据!
 32          * 从数据库查询数据!
 33          *  Thread-1 : null 为什么是null,并发了,过程如 Thread-0 所示
 34          *  Thread-2 : aaa
 35          *  Thread-0 :null  为什么是null,因为第一次读取map中没有值返回null,而cacheMap.put(key, "aaa")后
 36          *             并没有重新赋值给object  所以是null
 37          *             解决方案是 直接从cacheMap.get(key) 中获取,不要中间环节 object,这里我就不改了
 38          *  Thread-3 : aaa
 39          *  Thread-4 : aaa
 40          *  Thread-5 : aaa
 41          *  Thread-6 : aaa
 42          *  Thread-7 : aaa
 43          *  Thread-8: aaa
 44          *  Thread-9 : aaa
 45          *
 46          * @param key
 47          * @return
 48          */
 49         // public Object getData(String key) {
 50         // Object value = cacheMap.get(key);
 51         // if (value == null) {
 52         // System.out.println("从数据库查询数据!");
 53         // cacheMap.put(key, "aaa");
 54         // }
 55         // return value;
 56         // }
 57
 58         /**
 59          * 2.0 使用synchronized 同步 代码块 解决并发问题 实现方式简单 直接加synchronized 关键字
 60          *
 61          * 从数据库查询数据!
 62          *  Thread-4 : bbb
 63          *  Thread-1 : bbb
 64          *  Thread-2 : bbb
 65          *  Thread-0 : bbb
 66          *  Thread-3 : bbb
 67          *  Thread-8 : bbb
 68          *  Thread-7 : bbb
 69          *  Thread-6 : bbb
 70          *  Thread-9 : bbb
 71          *  Thread-5 : bbb
 72          *
 73          * @param key
 74          * @return
 75          */
 76 //         public synchronized Object getData(String key){
 77 //
 78 //         if ( cacheMap.get(key)==null) {
 79 //         System.out.println("从数据库查询数据!");
 80 //         cacheMap.put(key, "bbb");
 81 //         }
 82 //         return cacheMap.get(key);
 83 //         }
 84
 85         /**
 86          * 3.0 使用读写锁
 87          *
 88                         从数据库查询数据!
 89             Thread-1 : ccc
 90             Thread-3 : ccc
 91             Thread-4 : ccc
 92             Thread-2 : ccc
 93             Thread-0 : ccc
 94             Thread-5 : ccc
 95             Thread-7 : ccc
 96             Thread-8 : ccc
 97             Thread-9 : ccc
 98             Thread-6 : ccc
 99          */
100         private  ReadWriteLock rwl = new ReentrantReadWriteLock();
101         public Object getData(String key) {
102             //加锁了就要try finally ,避免异常情况下 代码一直被锁
103             rwl.readLock().lock();
104             try {
105                 if (cacheMap.get(key) == null) {
106                     try{
107                         //读锁 解掉 是为了写锁 加锁
108                         rwl.readLock().unlock();
109                         //加锁了就要try finally ,避免异常情况下 代码一直被锁
110                         rwl.writeLock().lock();
111                         // 避免第一个线程写完数据,后面的线程接着写
112                         if (cacheMap.get(key) == null) {
113                             System.out.println("从数据库查询数据!");
114                             cacheMap.put(key, "ccc");
115                         }
116                     }
117                     finally{
118                         rwl.writeLock().unlock();
119                     }
120                     rwl.readLock().lock();
121                 }
122             } finally {
123                 rwl.readLock().unlock();
124             }
125
126             return cacheMap.get(key);
127         }
128     }
129 }
时间: 2024-10-31 20:02:48

基于synchronized 或 ReadWriteLock实现 简单缓存机制的相关文章

手把手教你构建 Android WebView 的缓存机制 &amp; 资源预加载方案

前言 由于H5具备 开发周期短.灵活性好 的特点,所以现在 Android App大多嵌入了 Android Webview 组件进行 Hybrid 开发 但我知道你一定在烦恼 Android Webview 的性能问题,特别突出的是:加载速度慢 & 消耗流量 今天,我将针对 Android Webview 的性能问题,提出一些有效解决方案. 目录 1. Android WebView 存在什么性能问题? Android WebView 里 H5 页面加载速度慢 耗费流量 下面会详细介绍. 1.

Varnish缓存机制详细介绍及简单配置

Varnish是一款高性能的开源HTTP加速器,其主要用来做为反向代理中的缓存服务器使用,但其实Varnish本身也是具有反向代理功能的,但在创建连接和维持连接上,与Nginx相比差距很大,现在有一个很流行的架构就是前端用Nginx作为反向代理,后面加Varnish缓存服务器为Web服务加速 在将Varnish前先谈谈我们的浏览器缓存机制,现在的浏览器基本都具有缓存功能,它能将我们以前访问过的静态内容和可进行缓存的动态内容缓存再本地,而后在下次访问相同资源时,如果可以确认Server端的资源未发

简单的Map缓存机制实现

简单的Map缓存机制实现 大致思路是用一个单例的Map实现,当然此Map得是线程安全的--ConcurrentHashMap 原本项目需求是缓存十条消息,所以打算用Map实现缓存机制.中途夭折下面具体尚未实现... 当然此代码仞为半成品,具体得根据项目需求采用不同的原则清除缓存 package per.zww.util; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class CacheP

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室.

【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李志刚 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依然不明白其原因,可谓相当的郁闷呢!!为了确认下是否只是自己理解不深,我特意请教了其他几位小伙

简单了解到的浏览器的缓存机制

前段时间优化项目,设计到需要缓存静态文件的问题,静下心来了解了下浏览器的缓存机制. 首先,不知道大家注意到没有,HTTP请求的一下参数  此处,为第一次请求 response Headers  里面注意几个参数 Expries:是HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略. Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定).Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和

初识nginx反向代理和缓存机制(简单实现)

实现的需求图: 环境: nginx缓存和反向代理服务器:192.168.0.224 实际存储数据机器:192.168.0.37 一.实现反向代理 1.安装nginx,两台服务器都需要安装 1)安装依赖包 yum -y install gcc make cmake ncurses-devel libxml2-devel libtool-ltdl-devel gcc-c++ autoconf automake bison zlib-devel 2)下载nginx wget http://nginx.

彻底弄懂 HTTP 缓存机制 —— 基于缓存策略三要素分解法

导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依然不明白其原因,可谓相当的郁闷呢!!为了确认下是否只是自己理解不深,我特意请教了其他几位小伙伴,发现情况也或多或少和我类似. 为了不给大家卖关子,下面我贴出2道题,大家可以尝试解答下: 以下为 page.html 内容: <!DOCTYPE html><html xmlns="h

Android缓存机制&amp;一个缓存框架推荐

1.先推荐一个轻量级缓存框架--ACache(ASimpleCache) ACache介绍: ACache类似于SharedPreferences,但是比SharedPreferences功能更加强大,SharedPreferences只能保存一些基本数据类型.Serializable.Bundle等数据, 而Acache可以缓存如下数据: 普通的字符串.JsonObject.JsonArray.Bitmap.Drawable.序列化的java对象,和 byte数据. 主要特色: 1:轻,轻到只