10
votes

Un hashmap avec une méthode getandwait () existe-t-il? Par exemple. une implémentation de blockingConCurthHashMap?

De nombreux threads peuvent remplir un HASHMAP , dans certains cas, je dois attendre (bloc) jusqu'à ce qu'un objet existe dans le hashmap, tel que: xxx

se demande Si une telle chose existe déjà, je déteste réinventer les roues.


0 commentaires

5 Réponses :


0
votes

Je ne suis pas sûr de votre question. Voulez-vous attendre la valeur quand ce n'est pas sur la carte? Vous voulez le modèle de producteur-consommateur de blocageQueue sur une carte. Si c'est que je ne connais rien de même dans le JRE ou nulle part ailleurs.

Google Guava MapMaker vous permet de créer une carte informatique, c'est une carte qui crée la valeur si elle n'existe pas en utilisant une usine avec la fonction de type . Si plusieurs threads atteignent cette situation en même temps, on crée la valeur et les blocs de repos qui l'attendent. Je sais que ce n'est pas producteur-consommateur, mais c'est ce que je peux offrir.


3 commentaires

MMM ... La carte informatique pourrait être un bon démarrage en réalité, en ce que la fonction pourrait simplement encapsuler le blocage jusqu'à présent sur la carte. C'est un moyen relativement agréable de séparer l'aspect "Blocking" de l'aspect "Carte" et permet également de multiples stratégies tout simplement (par exemple, Spinning vs. dormant vs endormi vs attente-notifall contre ...)


Je suis en désaccord, andrzej. C'est une alternative, pas un bon départ. Le fil qui atteint la fonction doit renvoyer une valeur, il ne peut pas attendre un délai d'attente, ni le reste des lecteurs.


Merci pour l'idée, je vais y regarder. Et oui, je dois attendre une période de temps spécifiée (ou indéfiniment) jusqu'à ce qu'une clé spécifiée existe sur la carte, puis continue comme une opération d'obtention (clé) normale.



4
votes

Autant que je sache, il n'y a pas de «carte de transfert» disponible. Bien que la création d'une théorie n'est pas trop difficile. XXX

Il existe des exclusions évidentes dans cette classe. Ne pas mentionné la serrure aboryant; Inutile de dire que cela ne fonctionnera pas bien, mais vous devriez avoir l'idée de ce qui se passe


1 commentaires

Même question que dans la réponse de l'irreputable: la synchronisation autour de MET (Key, Val) est logique, je peux voir de nombreuses options de mise en œuvre pour améliorer les performances si nécessaire (même si cette affaire n'a pas de problème de performance). Mais la question est la suivante: puis-je compter sur Mettre (clé, Val) toujours appelée à chaque opération de mise? Il y a 3 méthode de vente: mettre (k, v), putaall (colection) et putifabsent (k, v).



3
votes

Amélioration de l'IPL de John, avec la destination visée (), au lieu de "troupeau tonnerre", qui est particulièrement mauvais lorsque personne n'attend sur une clé insérée

HashMap<K,Object> locks = new HashMap<>();

put(key, value)
    synchronized(locks)
        backingMap.put(key,value);

        lock = locks.get(key);
        if(lock!=null)
            lock.notifyAll();

getAndWait(key)
    // not hard, but pretty verbose


5 commentaires

+1 J'aime la référence du troupeau tonnerning. C'est un nouveau terme pour moi :)


C'est un terme aussi vivant que vous n'oublierez jamais une fois que vous l'avez entendu.


Je suis d'accord et je suis absolument approprié de la situation de sa décrire


Synchronisation autour de Met (Key, Val) a du sens, je peux voir de nombreuses options de mise en œuvre pour améliorer les performances si nécessaire (même si cette affaire n'a pas de problème de performance). Mais la question est la suivante: puis-je compter sur Mettre (clé, Val) toujours appelée à chaque opération de mise? Il y a 3 méthode de vente: mettre (k, v), putaall (colection) et putifabsent (k, v).


J'aime cette idée, mais un exemple de travail au lieu de pseudocode aurait été plus utile; Surtout que la synchronisation est impliquée.



2
votes

Vous pouvez remplir votre HASHTABLE avec java.util.concurrent.futuleTask S au début avec toutes les tâches dont vous avez besoin pour calculer. Vous utilisez ensuite un piscine de thread pour commencer à exécuter votre futuretask s. Vous pouvez obtenir vos résultats asynchroniquement avec objreturned obj = hashtable.get (clé) .get () , qui attendra si le futuretask en question n'est pas encore terminé.

Vous ne voulez probablement pas qu'un seul thread récupère les résultats car cela pourrait attendre sur la tâche qui se termine pour finir en dernier. Vous pouvez avoir plusieurs threads de récupération, ou vous pouvez parcourir les touches lorsque vous attendez une tâche trop longue pour une tâche (il existe une méthode futueTask.get (WAITTIME, TIMEUnit) ).


0 commentaires

4
votes

BlockingMap4J conviendra exactement à vos besoins.
Vous pouvez le trouver chez https://github.com/sarveswaran-m/blockingmap4j/wiki/
Étant donné que les verrous granulaires sont utilisés dans la mise en œuvre, les performances ne seront pas gravées gravement dégradées.

PS
C'est une réponse assez tardive sur une question de 2 ans. Depuis, il n'ya aucun moyen d'envoyer un message privé à l'auteur de la question, réponds ici.

Disclaimer
Je suis l'auteur de la bibliothèque.


3 commentaires

Vous devriez ajouter un clause de non-responsabilité indiquant que vous êtes l'auteur de cette bibliothèque.


@assylias - Non, ce n'est pas nécessaire. C'est un lien vers un projet Open Source , donc un conflit d'intérêts. La question semble avoir demandé des solutions existantes. Si vous avez technique préoccupation avec cette solution, postez-la - sinon cela n'a pas vraiment d'importance qui l'a suggéré.


@Chrisstratton pour le dossier que j'avais suscité la réponse et oui, les directives de Stackoverflow disent que L'utilisateur devrait décliner son affiliation .