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
}
多分これはあなたにとって便利です:jkeylockmanager
編集:
私の最初の反応はおそらく少し短かったです。私は著者であり、この問題に何度か直面し、既存の解決策を見つけることができませんでした。そのため、この小さなライブラリをGoogle Codeで作成しました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加