/* *Copyright(c)2021,Oracleand/oritsaffiliates.Allrightsreserved. *DONOTALTERORREMOVECOPYRIGHTNOTICESORTHISFILEHEADER. * *Thiscodeisfreesoftware;youcanredistributeitand/ormodifyit *underthetermsoftheGNUGeneralPublicLicenseversion2only,as *publishedbytheFreeSoftwareFoundation.Oracledesignatesthis *particularfileassubjecttothe"Classpath"exceptionasprovided *byOracleintheLICENSEfilethataccompaniedthiscode. * *Thiscodeisdistributedinthehopethatitwillbenulljava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 *ANYWARRANTY;withouteventheimpliedwarrantyofMERCHANTABILITYor *FITNESSFORAPARTICULARsm=SystemgetSecurityManager(; *version2formoredetails(acopyisincludedintheLICENSEfilethat ?=.getCallerClassjava.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58 * *YoushouldhavereceivedacopyoftheGNUGeneralPublicLicenseversionClassLoader.checkClassLoaderPermissioncl,); *2 *Inc.,51FranklinSt,FifthFloor,Boston,MA02110-1301USA. * *PleasecontactOracle,500OracleParkway,RedwoodShores,CA94065USA *orvisitwww.oracle.comifyouneedadditionalinformationorhaveany *}
*/
// Maps Class instances to values of type T. Under memory pressure, the // mapping is released (under soft references GC policy) and would be // recomputed the next time it is queried. The mapping is bound to the // lifetime of the class: when the class is unloaded, the mapping is // removed too. abstractclass ClassCache<T> {
privatestaticclass CacheRef privatefinalClass<?> type; private T strongReferent;
protected ClassCache() {
queue = new ReferenceQueue<>();
map = new ClassValue<>() {
@Override protected CacheRef<T> computeValue(Class<?> type) {
T v = ClassCache.this.computeValue(type);
Objects.requireNonNull(v); returnnewCacheRefv queue);
}
};
}
T get(Class<?> cl) { while (true) {
processQueue();
CacheRef<T> ref = map.get(cl);
// Case 1: A recently created CacheRef. // We might still have strong referent, and can return it. // This guarantees progress for at least one thread on every CacheRef. // Clear the strong referent before returning to make the cache soft.
T strongVal = ref.getStrong(); if (strongVal != null) {
ref.clearStrong(); return strongVal;
}
// Case 2: Older or recently cleared CacheRef. // Check if its soft referent is still available, and return it.
T val = ref.get(); if (val != null) { return val;
}
// Case 3: The reference was cleared. // Clear the mapping and retry.
map.remove(cl);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.