MySQL dispose d'une fonction très pratique:
SELECT GET_LOCK("SomeName")
Ceci peut être utilisé pour créer simple, mais très spécifique, à partir du nom des verrous pour une application. Cependant, elle nécessite une connexion de base de données.
J'ai beaucoup de situations comme:
someMethod() {
// do stuff to user A for their data for feature X
}
Il n'est pas judicieux de simplement synchroniser cette méthode, parce que, par exemple, si cette méthode est appelée pour l'utilisateur B dans l'intervalle, l'utilisateur B n'a pas besoin d'attendre pour Un utilisateur de se terminer avant qu'il ne commence, seules les opérations de l'utilisateur et la fonctionnalité X combinaison besoin d'attendre.
Avec MySql lock je pourrais faire quelque chose comme:
someMethod() {
executeQuery("SELECT GET_LOCK('userA-featureX')")
// only locked for user A for their data for feature X
executeQuery("SELECT RELEASE_LOCK('userA-featureX')")
}
Depuis Java de verrouillage est basé sur des objets, il me semble que j'aurais besoin de créer un nouvel objet à représenter la situation de cette serrure, puis le mettre dans un statique de cache quelque part donc tous les threads peuvent le voir. Des demandes ultérieures de verrouillage pour que la situation serait alors de localiser le verrou de l'objet dans le cache et l'acquisition de son verrouillage. J'ai essayé de créer quelque chose comme ça, mais alors le verrou du cache lui-même a besoin de synchronisation. Aussi, il est difficile de détecter si un verrou de l'objet n'est plus utilisé de sorte qu'il peut être retiré à partir du cache.
J'ai regardé le Java simultanées paquets, mais rien ne se démarque comme étant capable de gérer quelque chose comme ça. Est-il un moyen facile à mettre en œuvre, ou suis-je en regardant ce de la mauvaise perspective?
Edit:
Pour être clair, je ne cherche pas à créer un prédéfini piscine de serrures à l'avance, je voudrais créer sur la demande. Certains pseudo-code pour ce que je pense est:
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
}