java中数据缓存的核心机制

一、以下为集数家之长实现的数据缓存核心机制代码片段,以抛砖引玉,供大家学习,此片段的核心代码参考sun的源码实现。sun没有对此段代码开放,它的功能在ArrayBlockingQueue(jdk1.5)中已经实现并提供开放接口。没有时间看下面的代码的可直接查看ArrayBlockingQueue的api,如果对象ArrayBlockingQueue也没有兴趣的同学,可以直接调用ConcurrentHashMap(jdk1.5), ConcurrentSkipListMap(jdk1.6),这些类,api中有更加祥细的说明,这里不多说,需要注意的是因为此功能解决多线程并发问题,故null不能做为key和value的键值,可以理解为HashTable的提升。

 代码如下 复制代码

package com.henry;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class CacheDataTest {
 static Map<Integer,Object> dataMap=new HashMap<Integer,Object>();
 static ReadWriteLock lock=new ReentrantReadWriteLock();//创建读写锁的实例
 static Object getData(Integer key){
  lock.readLock().lock();//读取前先上锁
  Object val=null;
  try{
   val=dataMap.get(key);
   if(val == null){
    // Must release read lock before acquiring write lock
    lock.readLock().unlock();
    lock.writeLock().lock();
    try{      if(val==null){
      //dataMap.put(key, "");//query from db
      val=queryDataFromDB(key);     }finally{
     //Downgrade by acquiring read lock before releasing write lock
     lock.readLock().lock();
     // Unlock write, still hold read
     lock.writeLock().unlock();    }
  }finally{
   lock.readLock().unlock();//最后一定不要忘记释放锁   System.out.println("get data key="+key+">val="+val);
  return val; 
 static Object queryDataFromDB(Integer key){
  Object val=new Random().nextInt(1000);
  dataMap.put(key, val);
  System.out.println("write into data key="+key+">val="+val);
  return val;
 }

 
 public static void main(String[] args) {
  for(int i=0;i<10;i++){
   new Thread(new Runnable(){public void run() {
    getData(new Random().nextInt(5));
   }}).start();  }
}

时间: 2024-09-19 02:47:43

java中数据缓存的核心机制的相关文章

java中的几个存储机制

问题描述 java中的几个存储机制 新人初学java,有几个问题一直搞不懂,所以求教各位,感激不尽 1.关于堆栈和堆得问题,现在有这样一种说法,说是变量的存储机制是根据他的作用域决定的,一个方法里定义的变量,则这个变量在这个方法结束后,就会被销毁,所以他的存储的生命期是定好的,所以会存到栈里(堆栈),然后如果是定义的全局变量,是放在堆里的,但是我又看到书上说一般基本数据类型(byte,short,int long,float,double,char)这些是存放在栈里的,而引用数据类型,数组,对象

java中的缓存问题,求教各位

问题描述 java中的缓存问题,求教各位 刚开始工作,听同事说项目中用到了缓存技术,但是对缓存的知识不是很了解,希望大家帮助 解决方案 首先. 缓存简单说就是以空间换取时间的手段.这里的空间是指内存空间,而时间则指程序的运行时间. 比如从数据库中获取用户基本信息,如果每次都访问DB,那么程序代码需要等待DB的响应,如果本地有一个map,其中就存储了用户的基本信息,那么直接从map中获取,是否就提高了效率了呢?当然,这个本地的map只是一种本地缓存的简单例子.实际应用中,可以有本地缓存,远端缓存(

java中数据交换的问题

问题描述 java中数据交换的问题 晚上在写程序的时候需要用到交换数据,所以我就主类里面写了一个swap, 但是在调用之后发现数据没有交换成功,可是在swap里面数据的确交换成功了呀, 不知道是什么原因,下面贴出代码: public static void main(String[] args){ int a,b; a = 4; b = 5; swap(a,b); System.out.println(a+","+b); } public static void swap(int a,

请教 java中怎么缓存大量的数据,比如100w条记录

问题描述 我用OSCache缓存,从数据库中加载100w条记录,抛出outOfMemoryException各位大虾有没有比较好的缓存大量数据的方案啊100w条数据适合放在内存吗谢谢了问题补充:我现在查询了两个表的内容,表1的数据有25w条,表2的记录有19w条.为什么到处表2的数据时出现OutOfMemoryException,而导出表1的记录时却没有出现异常,而且表1的每条记录的数据量比表2的每条记录的数据量大. 解决方案 表2有级联吧要不就是表1所占用的内存没析构所以溢出了解决方案二:肯定

jQuery中数据缓存$.data的用法及源码完全解析_jquery

一.实现原理: 对于DOM元素,通过分配一个唯一的关联id把DOM元素和该DOM元素的数据缓存对象关联起来,关联id被附加到以jQuery.expando的值命名的属性上,数据存储在全局缓存对象jQuery.cache中.在读取.设置.移除数据时,将通过关联id从全局缓存对象jQuery.cache中找到关联的数据缓存对象,然后在数据缓存对象上执行读取.设置.移除操作. 对于Javascript对象,数据则直接存储在该Javascript对象的属性jQuery.expando上.在读取.设置.移

Java中常见的各类Cache机制实现方法和比较

问题描述 OSCacheOSCache是个一个广泛采用的高性能的JavaEE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案.OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存.拥有全面的API--OSCacheAPI给你全面的程序来控制所有的OSCache特性.永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启.支持集群--集群缓存

剖析Java中的事件处理与异常处理机制_java

一.事件处理其实,由事件处理这个名字自然就想到MFC中的消息响应机制,就我的体会,它们应该算是南桔北枳的情形吧,我怀疑Java中的事件处理这个"新瓶"应是装的MFC中的消息响应这个"旧酒".     所谓的"事件"即如键盘按键.鼠标点击等这类由动作或什么导致某个状态改变并需要对这个改变作相应响应的这类改变.我们可以将Java中的事件分为按钮.鼠标.键盘.窗口.其它事件这几大类.    事件处理模型  1.   基于继承的事件处理模型(JDK1.0

深入理解Java中的HashMap的实现机制_java

如果任何人让我描述一下HashMap的工作机制的话,我就简单的回答:"基于Hash的规则".这句话非常简单,但是要理解这句话之前,首先我们得了解什么是哈希,不是么? 什么是哈希 哈希简单的说就是对变量/对象的属性应用某种算法后得到的一个唯一的串,用这个串来确定变量/对象的唯一性.一个正确的哈希函数必须遵守这个准则. 当哈希函数应用在相同的对象或者equal的对象的时候,每次执行都应该返回相同的值.换句话说,两个相等的对象应该有相同的hashcode. 注:所有Java对象都从Objec

java中数据的传递方式到底是怎样的!

今天早上我了一道有关java的题.主要考点是考java中值得传递方式. 之前我在javaoo里总结的是:基本数据类型中保存的是实际的值,引用数据类型保存的是被引用的内存地址,那么基本数据类型就是按值传递,引用数据类型就是按地址来传递的.(难道我一开始就错了) 题是真样的: 1 public class SendValue{ 2 public String str="6"; 3 public static void main(String[] args) { 4 SendValue sv