(07)Ehcache对并发的支持

x33g5p2x  于2021-12-25 转载在 其他  
字(1.7k)|赞(0)|评价(0)|浏览(474)

在高并发的情况下,使用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锁将不需要等待。获取了对应的锁之后,记得在不再需要该锁后释放该锁。并且需要注意不要引起死锁。

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

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

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

相关文章