Первое, что я замечаю в коде, это то, что он смешивает общие типы с необработанными. Это просто приведет к беспорядку. javac в JDK7 имеет -Xlint:rawtypes для быстрого обнаружения такого рода ошибок до того, как начнутся проблемы.
Код не является потокобезопасным, но использует статику, поэтому публикуется во всех потоках. Вы, вероятно, не хотите, чтобы это было synchronized, потому что это вызовет проблемы, если состязаться на многопоточных машинах.
Проблема с использованием SoftReference для всего кеша заключается в том, что вы вызовете всплески, когда ссылка будет очищена. В некоторых случаях может быть лучше иметь ThreadLocal<SoftReference<Map<K,V>>>, который будет распространять пики и обеспечивать безопасность потока помощи за счет отсутствия совместного использования потоков между потоками.
Однако создать более умный кеш сложнее. Часто вы получаете значения, ссылающиеся на ключи. Есть способы обойти этот бит, это беспорядок. Я не думаю, что эфемероны (по сути, пара связанных Reference) сделают JDK7. Вы можете найти коллекции Google, на которые стоит обратить внимание (хотя я этого не делал).
java.util.LinkedHashMap дает простой способ ограничить количество кешированных записей, но не очень полезен, если вы не можете быть уверены, насколько велики записи, и может вызвать проблемы, если он останавливает сбор больших объектных систем, таких как ClassLoaders. Некоторые люди говорят, что вы не должны оставлять вытеснение кеша на усмотрение сборщика мусора, но другие говорят, что вам не следует использовать сборщик мусора.
person
Tom Hawtin - tackline
schedule
12.07.2009