Ehcache WriteLock 解决数据并发操作

Ehcache读写锁

当一个线程取得某一缓存key的read锁之后

1) 此线程不可以取得该key的write锁(即此线程不能写入该key的值);
2) 其他线程可以取得该key的read锁, 但不能取得write锁(即其他线程可以读取该key的值, 但不能写入). 要等到该线程(或所有线程)释放该key的read锁后, 才能获得write锁

当一个线程取得某一缓存key的write锁之后
1) 此线程可以取得该key的read锁(即此线程可以读取该key的值);

2) 其他线程不可以取得该key的read锁和write锁(即其他线程不能读取或写入该key的值). 要等到该线程释放该key的write锁后才能获得.

public boolean acquireLock(Order order, User user) {
	Assert.notNull(order);
	Assert.isTrue(!order.isNew());
	Assert.notNull(user);
	Assert.isTrue(!user.isNew());

	Long orderId = order.getId();
	Ehcache cache = cacheManager.getEhcache(Order.ORDER_LOCK_CACHE_NAME);
	//获取写锁保证数据操作的准确性
	cache.acquireWriteLockOnKey(orderId);
	try {
		Element element = cache.get(orderId);
		//如果value不等于当前用户id, 说明当前订单被其他用户操作, 获取订单锁失败
		if (element != null && !user.getId().equals(element.getObjectValue())) {
			return false;
		}
		cache.put(new Element(orderId, user.getId()));
	} finally {
		cache.releaseWriteLockOnKey(orderId);
	}
	return true;
}
<cache name="orderLock" maxElementsInMemory="1000000" timeToLiveSeconds="60" eternal="false" overflowToDisk="true" />



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值