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锁将不需要等待。获取了对应的锁之后,记得在不再需要该锁后释放该锁。并且需要注意不要引起死锁。 在Ehcache接口中为我们定义了几个与Read、Write锁相关的方法,具体方法如下所示:

    public interface Ehcache {
     
        /**
         * 获取给定Key的Read锁
         * @param key
         */
        public void acquireReadLockOnKey(Object key);
     
        /**
         * 获取给定Key的Write锁
         * @param key
         */
        public void acquireWriteLockOnKey(Object key);
     
        /**
         * 尝试着获取给定Key的Read锁,如果在给定timeout时间内还没有获取到对应的Read锁,则返回false,否则返回true。
         * @param key
         * @param timeout 超时时间,单位是毫秒
         * @return表示是否获取到了对应的Read锁
         * @throws InterruptedException
         */
        public boolean tryReadLockOnKey(Object key, long timeout) throws InterruptedException;
     
        /**
         * 尝试着获取给定Key的Write锁,如果在给定timeout时间内还没有获取到对应的Write锁,则返回false,否则返回true。
         * @param key
         * @param timeout 超时时间,单位是毫秒
         * @return表示是否获取到了对应的Write锁
         * @throws InterruptedException
         */
        public boolean tryWriteLockOnKey(Object key, long timeout) throws InterruptedException;
     
        /**
         * 释放所持有的给定Key的Read锁
         * @param key
         */
        public void releaseReadLockOnKey(Object key);
     
        /**
         * 释放所持有的给定Key的Write锁
         * @param key
         */
        public void releaseWriteLockOnKey(Object key);
      
    }

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

       @Test
       public void test() {
          CacheManager cacheManager = CacheManager.create();
          cacheManager.addCache("test");
          Cache cache = cacheManager.getCache("test");
          final String key = "abc";
          cache.acquireWriteLockOnKey(key);
          try {
             cache.put(new Element(key, "123"));
          } finally {
             System.out.println(cache.get(key));
             cache.releaseWriteLockOnKey(key);
          }
       }

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

  • 相关阅读:
    paip.提升效率僵尸代码的迷思
    paip.输入法编程词库多意义条目分割 python实现.
    paip.提升效率提升绑定层次form绑定取代field绑定
    paip.提升效率调试日志系统日志参数含义python
    paip.自定义java 泛型类与泛型方法的实现总结
    paip.提升效率request自动绑定domain object
    paip.提升效率filter map reduce 的java 函数式编程实现
    paip.php 5.0 5.3 5.4 5.5 6.0的新特性总结与比较
    paip.解决中文url路径的问题图片文件不能显示
    paip.判断字符是否中文与以及判读是否是汉字uapi python java php
  • 原文地址:https://www.cnblogs.com/xinting/p/12536142.html
Copyright © 2011-2022 走看看