zoukankan      html  css  js  c++  java
  • Ehcache(07)——Ehcache对并发的支持

    Ehcache对并发的支持

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

  • 相关阅读:
    关于 Android 进程保活,你所需要知道的一切【转】
    android 按返回键最小化(后台运行)
    android notification完全解析【转】
    使用WakeLock使Android应用程序保持后台唤醒
    [Linux]Vim基本操作
    [STL]map的使用
    [python]使用python进行LINUX系统操作
    python challenge 2:迭代与列表
    python challenge 1、3:字符串处理
    python challenge 0:操作符与内建函数
  • 原文地址:https://www.cnblogs.com/Jeely/p/11949287.html
Copyright © 2011-2022 走看看