`

Ehcache对并发的支持

 
阅读更多

转自:http://haohaoxuexi.iteye.com/blog/2119733

Ehcache对并发的支持

 

       在高并发的情况下,使用Ehcache缓存时,由于并发的读与写,我们读的数据有可能是错误的,我们写的数据也有可能意外的被覆盖。所幸的是Ehcache为我们提供了针对于缓存元素KeyRead(读)、Write(写)锁。当一个线程获取了某一KeyRead锁之后,其它线程获取针对于同一个KeyRead锁不会受到限制,但其它线程(包括获取了该KeyRead锁的线程)如果想获取针对同一个KeyWrite锁就不行,它需要等到针对于该KeyRead锁释放后才能获取其Write锁;当一个线程获取了某一KeyWrite锁之后,其它线程获取同一个KeyRead锁或者Write锁的请求将等待针对于该KeyWrite锁释放后才能继续进行,但是同一个线程获取该Key对应的Read锁或者Write锁将不需要等待。获取了对应的锁之后,记得在不再需要该锁后释放该锁。并且需要注意不要引起死锁。

Java代码  收藏代码
  1.        在Ehcache接口中为我们定义了几个与Read、Write锁相关的方法,具体方法如下所示:  
  2. public interface Ehcache {  
  3.    
  4.     /** 
  5.      * 获取给定Key的Read锁 
  6.      * @param key 
  7.      */  
  8.     public void acquireReadLockOnKey(Object key);  
  9.    
  10.     /** 
  11.      * 获取给定Key的Write锁 
  12.      * @param key 
  13.      */  
  14.     public void acquireWriteLockOnKey(Object key);  
  15.    
  16.     /** 
  17.      * 尝试着获取给定Key的Read锁,如果在给定timeout时间内还没有获取到对应的Read锁,则返回false,否则返回true。 
  18.      * @param key 
  19.      * @param timeout 超时时间,单位是毫秒 
  20.      * @return表示是否获取到了对应的Read锁 
  21.      * @throws InterruptedException 
  22.      */  
  23.     public boolean tryReadLockOnKey(Object key, long timeout) throws InterruptedException;  
  24.    
  25.     /** 
  26.      * 尝试着获取给定Key的Write锁,如果在给定timeout时间内还没有获取到对应的Write锁,则返回false,否则返回true。 
  27.      * @param key 
  28.      * @param timeout 超时时间,单位是毫秒 
  29.      * @return表示是否获取到了对应的Write锁 
  30.      * @throws InterruptedException 
  31.      */  
  32.     public boolean tryWriteLockOnKey(Object key, long timeout) throws InterruptedException;  
  33.    
  34.     /** 
  35.      * 释放所持有的给定Key的Read锁 
  36.      * @param key 
  37.      */  
  38.     public void releaseReadLockOnKey(Object key);  
  39.    
  40.     /** 
  41.      * 释放所持有的给定Key的Write锁 
  42.      * @param key 
  43.      */  
  44.     public void releaseWriteLockOnKey(Object key);  
  45.     
  46. }  

 

 

       我们常用的Cache类已经为我们实现了这些方法,我们可以直接在程序中进行使用。以下是直接在程序中使用锁的一个简单示例。

 

Java代码  收藏代码
  1. @Test  
  2. public void test() {  
  3.    CacheManager cacheManager = CacheManager.create();  
  4.    cacheManager.addCache("test");  
  5.    Cache cache = cacheManager.getCache("test");  
  6.    final String key = "abc";  
  7.    cache.acquireWriteLockOnKey(key);  
  8.    try {  
  9.       cache.put(new Element(key, "123"));  
  10.    } finally {  
  11.       System.out.println(cache.get(key));  
  12.       cache.releaseWriteLockOnKey(key);  
  13.    }  
  14. }  

 

 

       记得需要在合适的时候释放所获取的锁。

 

 

(注:本文是基于ehcache2.8.1所写)

分享到:
评论

相关推荐

    Java高并发高性能分布式框架从无到有微服务架构设计.doc

    它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一 个gzip缓存servlet过滤器,支持REST和SOAP api等特点。MapDB: mapdb是一个内嵌的纯java的数据库,提供了并发的HashMap、TreeMap、Queue,可以基 于...

    Java博客系统Zblog2.zip

    Zblog是一个java实现的开源博客系统。 核心功能 文章/页面发布、分类、统计阅读次数。 提供文章形式的RSS聚合。 提供链接的添加、归类功能。...注:前台界面部分借鉴自Flat和并发编程网。 标签:Zblog

    Extjs4.0通用后台管理系统源码完整大型项目可二次开发

    4系统是公司多个项目的基础框架,稳定性好,支持大并发。 开发工具和采用技术 1开发工具:Eclipse、MyEclipse和其他IDE。 2采用Spring 3中最新最稳定的Spring MVC 3.2.8版本。 3采用Hibernate 4.1.7。Spring MVC ...

    hibernate 3中的缓存小结

    l JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。 2.3.5. 配置二级缓存的主要步骤: 1) 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这...

    JAVA多用户B2B2C商城系统源码

    使用Spring+JPA+Velocity+Ehcache作为基础开发架构,应用SpringSecurity框架管理系统权限,结合URL重写技术静态化商城前台页面。 Shopping结合多年的电商开发经验及主流电商的功能特点,注重系统易用性、功能性、...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 mysql版本_spring3.0

    23.ehcache 自定义二级缓存 ,选择缓存存放目录,处理并发,增加系统性能 24.服务器内部GET POST 请求 25.uploadify 上传插件,单条、批量上传,带进度条,异步,图片、视频, 其它文件格式均可上传 26.地图选点获取...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 oracle版本_spring3.0

    23.ehcache 自定义二级缓存 ,选择缓存存放目录,处理并发,增加系统性能 24.服务器内部GET POST 请求 25.uploadify 上传插件,单条、批量上传,带进度条,异步,图片、视频, 其它文件格式均可上传 26.地图选点获取...

    cache4j:轻量级java内存缓存框架,实现FIFO、LRU、TwoQueues缓存模型

    支持并发。 使用简单。 因为简单,所以通用,命中率稳定。 使用示例 // 配置 CacheConfig config = CacheConfig.custom().setMaxElement(10000); // 缓存元素个数上限 // 缓存节点工厂 INodeFactory<String> ...

    MF00001-JAVA多用户B2B2C商城源码.zip

    Shopping结合多年的电商开发经验及主流电商的功能特点,注重系统易用性、功能性、扩展性,充分考虑大数据、大并发、系统安全、SEO功能,使得系统设计更加完善,更加高效稳定Shopping系统融合当前主流B2B2C、C2C购物...

    本地缓存之王Caffeine 保姆级教程(值得珍藏)

    在编程领域,缓存是不可或缺的一部分,从处理器到应用层,其...实际上,Caffeine与ConcurrentMap在功能上有许多相似之处,都支持并发操作,且数据的存取时间复杂度为O(1)。然而,二者在数据管理策略上存在显著差异:

    最新JAVA通用后台管理系统(ExtJS 4.2+Hibernate 4.1.7+Spring MVC 3.2.8)MyEclipse版本

    4、系统是公司多个项目的基础框架,稳定性好,支持大并发。 二、主要功能 1、采用ExtJS 4.2.1.883无限制版本,放心用于网站开发。 2、ExtJS富文本编辑器增加修改信息。 3、ExtJS的HtmlEditor的图片文件上传插件。 ...

    最新JAVA通用后台管理系统(ExtJS 4.2+Hibernate 4.1.7+Spring MVC 3.2.8)Eclipse版本

    4、系统是公司多个项目的基础框架,稳定性好,支持大并发。 二、主要功能 1、采用ExtJS 4.2.1.883无限制版本,放心用于网站开发。 2、ExtJS富文本编辑器增加修改信息。 3、ExtJS的HtmlEditor的图片文件上传插件。 ...

    Java通用后台管理系统源码 JAVATYHTXT.rar

    4、系统是公司多个项目的基础框架,稳定性好,支持大并发。 二、主要功能 1、采用ExtJS 5.1无限制免费版本,放心用于网站开发。 2、ExtJS富文本编辑器增加修改信息。 3、ExtJS的HtmlEditor的图片文件上传插件。 4...

    java开源包1

    1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. ...

    java开源包11

    1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. ...

    java开源包2

    1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. ...

    java开源包3

    1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. ...

Global site tag (gtag.js) - Google Analytics