Imaginons que vous soyez paranoïaque et doublement paranoïaque en matière de multithreading. Supposons que vous exécutiez le backend de certaines fonctionnalités de l'application et que l'application récupère périodiquement certaines méthodes sur vos serveurs. Tout semble être bon, mais il y en a un mais. Et si votre fonctionnalité dépendait directement d'autres données, le même profil banal par exemple ? La question est de savoir comment s'assurer que le script fonctionne exactement comme vous l'aviez prévu et qu'il n'y ait pas de surprises ? Transactions? Oui, il peut être utilisé, mais que se passe-t-il si vous êtes un paranoïaque fantastique et imaginez déjà comment 10 requêtes à la même méthode provenant de clients différents volent vers votre serveur et toutes strictement en même temps. Et en ce moment, la logique métier de cette méthode est liée à 100 500 données différentes. Comment gérez-vous tout cela ? Vous pouvez simplement synchroniser la méthode et c'est tout.Mais que se passe-t-il s'il y a aussi ces demandes qui n'ont pas de sens à garder ? Ici, les béquilles commencent déjà. J'ai déjà posé une question similaire plusieurs fois, et c'était intéressant, car la tâche est absurdement simple et quotidienne (si vous vous souciez qu'il n'y ait pas de bogues logiques, bien sûr). Aujourd'hui, j'ai décidé de réfléchir à la façon dont cela peut être mis en œuvre très simplement et sans béquilles. Et la solution est sortie littéralement en 100 lignes de code.
Un petit exemple illustratif
Supposons qu'il y ait un conducteur et un passager. Le conducteur ne peut pas changer de voiture tant que le client, par exemple, n'a pas confirmé le voyage. Il s'avère que le client a accepté un voyage avec les mêmes caractéristiques de la voiture, mais en fait le conducteur a-t-il une voiture différente ? Ne le fais pas ! Vous pouvez organiser quelque chose comme ceci :
String result = l.lock(new ArrayList<Locker.Item>() {{
add(new Locker.Item(SimpleType.TRIP, 1));
add(new Locker.Item(SimpleType.USER, 2));
}}, () -> {
//
// - - USER=2 (),
// - TRIP=1
// USER=3, :)
// :)
return " :)";
});
Élégant et simple !
Ne jetez pas de pierres ! )