2015-03-13 3 views
0

http://www.java2s.com/Code/Java/Collections-Data-Structure/ExpiringMap.htmcaching TTL basé cache

Q1). Je suis confus pourquoi nous avons besoin d'un verrou lorsque getLastAccessTime est appelé. Cette méthode n'est appelée que par le thread expirer. Q2) Supposons, par exemple, que si la carte est appelée uniquement par un thread, alors nous avons besoin d'un verrou réentrant dans l'objet ExpiringObject. Parce que setLastAccessTime est appelé par le thread uniquement lors de l'appel de la méthode put de Map et que la méthode getLastAccessTime sera appelée par le thread Expirer. La raison pour laquelle je demande est, j'ai testé l'insertion d'objets 1M, Reentrant Lock prend plus de 100MB

Répondre

0

Le verrou est nécessaire, car la valeur longue ne peut pas être mis à jour atomiquement sur les systèmes 32 bits.

Alternatives:

  • Remettez en place le temps d'un long. La mise à jour de référence est atomique.

  • Utilisez AtomicLong

  • l'objet de continuer à utiliser de verrouillage, mais utiliser un tableau statique de serrures avec une taille d'environ la double nombre de processeurs disponibles et l'index avec les verrous [hashCode()% locks.length]

Et la dernière option: Utilisez un cache, qui fonctionne déjà de manière optimisée, comme EHCache, Google Guava ou cache2k.

+0

ouais j'ai décidé d'utiliser EhCache, mais je voulais quand même savoir la solution. Toutes vos propositions étaient très excellentes. – Paul

0

Pour répondre à votre question, je ne suis pas vraiment sûr pourquoi lastAccessTimeLock nécessiterait un verrou puisque les changements à celui-ci n'ont pas besoin de coïncider avec des changements à quoi que ce soit d'autre (atomiquement). OMI, il n'a pas besoin de la serrure. Vous voudrez vous assurer que les changements à lastAccessTimeLock sont vus par d'autres discussions, ce qui peut être accompli en le marquant comme volatile ou en utilisant AtomicLong. En ce qui concerne votre problème d'utilisation de la mémoire, vous pouvez consulter cette bibliothèque ExpiringMap plutôt que d'utiliser l'implémentation Mina.