缓冲池实例剖析

在网上找了一个例子,试着运行之后,画出了他的时序图。以后便于复习

package cache;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 缓存池
 * @author Administrator
 */
public class CachePool { 

    // 缓存池唯一实例
    private static CachePool instance;
    // 缓存Map
    private static Map<String, Object> cacheItems;
    private CachePool() {
       cacheItems = new HashMap<String, Object>();
    }
    /**
    * 获取唯一的实例
    * @return instance
    */

    public synchronized static CachePool getInstance() {
       if (instance == null) {
           instance = new CachePool();
       }
       return instance;
    }
    /**
      * 清除所有的Item缓存
    */
    public synchronized void clearAllItems() {
      cacheItems.clear();
    }
    /**
     * 获取缓存实例
     * @param name 缓存名称
     * @return 缓存实例
    */
    public synchronized Object getCacheItem(String name) {
         if (!cacheItems.containsKey(name)) {
            return null;
         }
        CacheItem cacheItem = (CacheItem) cacheItems.get(name);
        if (cacheItem.isExpired()) {
          return null;
        }
       return cacheItem.getEntity();
    }
    /**
     * 存放缓存信息
     * @param name 名称
     * @param obj 实例对象
     * @param expires 超时时长
     */
    public synchronized void putCacheItem(String name, Object obj, long expires) {
        // 判断该对象是否在在缓存池,不在直接put
       if (!cacheItems.containsKey(name)) {
          cacheItems.put(name, new CacheItem(obj, expires));
       }
        // 获取缓存池中对象,更新对象信息
       CacheItem cacheItem = (CacheItem) cacheItems.get(name);
       cacheItem.setCreateTime(new Date());
       cacheItem.setEntity(obj);
       cacheItem.setExpireTime(expires);
     }
     /**
     * 移除缓存数据
     * @param name
     */
     public synchronized void removeCacheItem(String name) {
       if (!cacheItems.containsKey(name)) {
        return ;
       }
      cacheItems.remove(name);
     }
     /**
     * 获取缓存数据的数量
     * @return
      */
     public int getSize() {
       return cacheItems.size();
      }
}
package cache;

import java.util.Date;

public class CacheItem {
    //创建缓存的时间
    private Date createTime = new Date();
    //缓存期满时间
    private long expireTime = 1;
    //缓存实体
    private Object entity;

    public CacheItem(Object obj,long expire){
        this.entity = obj;
        this.expireTime = expire;
    }
    //判断缓存是否超时
    public boolean isExpired(){
        return (expireTime!=-1 && new Date().getTime() - createTime.getTime() > expireTime);
    }

    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Object getEntity() {
        return entity;
    }
    public void setEntity(Object entity) {
        this.entity = entity;
    }
    public long getExpireTime() {
        return expireTime;
    }
    public void setExpireTime(long expireTime) {
        this.expireTime = expireTime;
    }
}
package cache;

public class Student {
     private String name;
     private String id;
     private int age;
     private int sal;
     public Student() { 

     }
     public Student(String name, String id, int age, int sal) {
      this.name = name;
      this.id = id;
      this.age = age;
      this.sal = sal;
     }
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public String getId() {
      return id;
     }
     public void setId(String id) {
      this.id = id;
     }
     public int getAge() {
      return age;
     }
     public void setAge(int age) {
      this.age = age;
     }
     public int getSal() {
      return sal;
     }
     public void setSal(int sal) {
      this.sal = sal;
     }
}
package cache;

public class MainTest {
     /**
      * @param args
      * @throws InterruptedException
      */
     public static void main(String[] args) throws InterruptedException {
      // 获取缓存池
      CachePool cachePool = CachePool.getInstance();
      Student stu1 = new Student("l1", "stu001", 25, 40);
      Student stu2 = new Student("l2", "stu002", 25, 40);
      Student stu3 = new Student("l3", "stu003", 25, 40);
      Student stu4 = new Student("l4", "stu004", 25, 40);
      cachePool.putCacheItem("001", stu1, 122222);
      cachePool.putCacheItem("002", stu2, 10);
      cachePool.putCacheItem("003", stu3, 360002);
      cachePool.putCacheItem("004", stu4, 1222222);
      // 设置线程休眠,其中002对象会超时
      Thread.sleep(200);
      Student stu001 = (Student) cachePool.getCacheItem("001");
      if (null != stu001) {
       System.out.println(stu001.getName());
      }
      // 由于超时,这里取出的002对象为null
      Student stu002 = (Student) cachePool.getCacheItem("002");
      if (null != stu002) {
       System.out.println(stu002.getName());
      }
      // 获取打印缓存池中对象数量
      int cacheSize = cachePool.getSize();
      System.out.println(cacheSize);
      // 删除对象002
      cachePool.removeCacheItem("002");
      // 打印缓存池数量
      cacheSize = cachePool.getSize();
      System.out.println(cacheSize);
     }
}
时间: 2024-10-19 18:57:13

缓冲池实例剖析的相关文章

Seq_file文件系统实例剖析

http://blog.chinaunix.net/uid-24432676-id-2607766.html 另 http://www.cnblogs.com/qq78292959/archive/2012/06/13/2547335.html Seq_file文件系统实例剖析的两篇文章 2011-05-07 21:51:29 分类: LINUX 文章一:Seq_file File System针对proc文件的不足而诞生了Seq_file.Seq_file的实现基于proc文件.使用Seq_f

《PNG文件格式》(三)PNG文件实例剖析

欢迎查看系列博客: <PNG文件格式>(一)PNG文件概述     <PNG文件格式>(二)PNG文件格式分析 <PNG文件格式>(三)PNG文件实例剖析(本篇) 摘自: 中文PNG格式说明:dev.gameres.com PNG文件格式白皮书:www.w3.org LZ77算法的JAVA实现:jazzlib.sourceforge.net LZ77算法的JAVA实现,包括J2ME版本:www.jcraft.com ===========================

Android实例剖析笔记(三)

摘要:点介绍Activity的生命周期,通过一个简单的实验来摸索状态转换的机制 Activity的生命周期 Activity类中有许多onXXX形式的函数可以重载,比如onCreate,onStart,onStop,onPause,那么它们的调用顺序到底是如何的呢?下面就通过一个实验来进行分析.在做这个实验之前,我们先得知道如何在Android中进行Log输出的.我们要使用的是android.util.log类,这个类相当的简单易用,因为它提供的全是一些静态方法: Log.v(String ta

Shell编程之批量安装服务脚本实例剖析

今天分享一下昨天写过的一个小脚本运行的整个过程运行结果如下:   剖析如下: #!/bin/bash # Date: 4:42 2018-2-10 # Mail: [email protected]163.com # Founder: <YanKai> # Describe: This is a one - button installation service script # 提示:使用此脚本时,尽量先选择第一项配置Yum源! red_col="\e[1;31m" #定

SHELL网络爬虫实例剖析

前天简单分享了用 shell 写网络爬虫的一些见解,今天特地把代码发出来与51博友分享,还是那句话,爱技术.爱开源.爱linux. 针对脚本的注解和整体构思,我会放到脚本之后为大家详解. #!/bin/bash # # This script is used to grab the data on the specified industry websites # Written by sunsky # Mail : [email protected] # Date : 2014-09-14 3

[译]实例剖析-如何制作一个牛B的融资PPT

一些好公司明明在模式上富有创新性,但却在 pitch 时很保守,而且他们又不缺设计和开发能力.如何设计你的融资演讲稿才会吸引投资人对你投资?投资人 Daniel Eckler给大家贡献了下面这篇技术贴. 记住一个精心设计的融资演讲稿和你的产品一样重要,它有助于提高你演讲效果,让你的表述变得更加清晰.和面试相比,戴领带和系纽扣不会让你得到这份工作,但它可以为你塑造一个良好的形象. 以我为新公司Mylo设计的演讲稿为研究案例,我将向你展示如何设计一个吸引人的融资演讲稿. 快速思考:Don'ts 和

线上多服务管理工具实例剖析

公司线上对nginx.tomcat和jar包的java应用的服务管理脚本之前都是单独分离开的,这样子就造成了运维人员在跳板机上进行服务管理的时非常的不方便.特别是把这些服务管理框架纳入到自动化管理平台时,没有一个统一的服务管理接口去使用. 因此,在空的时候,我就将多个服务的管理脚本融合在了一起,将他做成一个工具,这样子就减少了服务管理的杂乱. 废话不说了,下面就是脚本内容,文章结尾我会简单介绍该脚本的思路. #!/bin/bash # # 本脚本用来对系统上的多服务进行管理操作 # 目前仅支持n

数据库设计三大范式应用实例剖析

引言 数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的.结构明晰的,同时,不会发生插入(insert).删除(delete)和更新(update)操作异常.反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息. 设计范式是不是很难懂呢?非也,大学教材上给我们一堆数学公式我们当然看不懂,也记不住.所以我们很多人就根本不按照范式来设计数据库. 实质上,设计范式用很形象.很简洁的话语就能说清楚,道明白.本文将对范式进行通俗地说明,并以

MySQL慢日志监控脚本实例剖析

公司线上的 MySQL 慢日志,之前一直没有做好监控.趁着上周空闲,我就把监控脚本写了下,今天特地把代码发出来与51博友分享一下. 针对脚本的注解和整体构思,我会放到脚本之后为大家详解. #!/bin/bash # # 本脚本用来在指定频率内监控 MySQL 慢日志的变化,并在发生增长时及时报警 # Written by sunsky # Mail : [email protected] # Date : 2014-11-17 10:00:00 # MON_FILE="$2"   #