java x锁_基于Java名称的锁?
MySQL具有方便的功能:
SELECT GET_LOCK("SomeName")
這可用于為應(yīng)用程序創(chuàng)建簡單但非常具體的基于名稱的鎖。但是,它需要數(shù)據(jù)庫連接。
我有很多情況,例如:
someMethod() {
// do stuff to user A for their data for feature X
}
簡單地同步此方法是沒有意義的,因為,例如,如果在此期間同時為用戶B調(diào)用了此方法,則用戶B無需等待用戶A完成操作就可以開始操作,而只需為用戶進行操作A和功能X的組合需要等待。
使用MySql鎖,我可以執(zhí)行以下操作:
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鎖定基于對象,因此似乎需要創(chuàng)建一個新對象來表示此鎖定的情況,然后將其放在某個位置的靜態(tài)緩存中,以便所有線程都可以看到它。隨后針對該情況進行鎖定的請求將在高速緩存中定位鎖定對象并獲取其鎖定。我試圖創(chuàng)建類似這樣的東西,但是鎖緩存本身需要同步。而且,很難檢測何時不再使用鎖定對象,以便可以將其從緩存中刪除。
我已經(jīng)看過Java并發(fā)包,但是沒有什么能夠處理這樣的事情了。有沒有簡單的方法可以實現(xiàn)此目的,還是我從錯誤的角度看待這個問題?
編輯:
為了明確起見,我不希望提前創(chuàng)建預(yù)定義的鎖池,而是希望根據(jù)需要創(chuàng)建它們。我在想的一些偽代碼是:
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
}
總結(jié)
以上是生活随笔為你收集整理的java x锁_基于Java名称的锁?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外星人台式机无盘服务器,可以拎走的“台式
- 下一篇: unixbench类似_UnixBenc