`

Ehcache(07)——Ehcache对并发的支持

阅读更多

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所写)

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics