java名称_简单的基于Java名称的锁?

MySQL具有方便的功能:

SELECT GET_LOCK("SomeName")

这可用于为应用程序创建简单的但非常特定的基于名称的锁。但是,它需要数据库连接。

我有很多情况,例如:

someMethod() {

// do stuff to user A for their data for feature X

}

简单地同步此方法是没有意义的,因为,例如,如果在此期间同时为用户B调用此方法,则用户B无需等待用户A完成操作就可以开始操作,而只需为用户进行操作A和功能X的组合需要等待。

使用MySql锁,我可以执行以下操作:

someMethod() {

executeQuery("SELECT GET_LOCK('userA-featureX')")

// only locked for user A for their data for feature X

executeQuery("SELECT RELEASE_LOCK('userA-featureX')")

}

由于Java锁定基于对象,因此似乎需要创建一个新对象来表示此锁定的情况,然后将其放置在某个位置的静态缓存中,以便所有线程都可以看到它。随后针对该情况进行锁定的请求将随后在高速缓存中定位锁定对象并获取其锁定。我试图创建类似这样的东西,但是锁缓存本身需要同步。另外,很难检测何时不再使用锁定对象,以便可以将其从缓存中删除。

我已经看过Java并发包,但是没有什么能够处理这样的事情了。有没有简单的方法可以实现此目的,还是我从错误的角度看待这个问题?

编辑:

为了明确起见,我不希望提前创建预定义的锁池,而是希望根据需要创建它们。我在想的一些伪代码是:

LockManager.acquireLock(String name) {

Lock lock;

synchronized (map) {

lock = map.get(name);

// doesn't exist yet - create and store

if(lock == null) {

lock = new Lock();

map.put(name, lock);

}

}

lock.lock();

}

LockManager.releaseLock(String name) {

// unlock

// if this was the last hold on the lock, remove it from the cache

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值