📄 cache.java
字号:
/* * $Source: /home/data/cvsroot/src/jacomma/util/Cache.java,v $ * $Revision: 1.8 $ * $Date: 2000/10/28 20:09:08 $ * * This file is part of the jacomma framework * Copyright (c) 2000 Dimitrios Vyzovitis * mailto:dviz@egnatia.ee.auth.gr * * * * * * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA */package jacomma.util;/** * TBA **/public class Cache { RdWrMap ht_; java.lang.ref.ReferenceQueue que_; _Recent rc_; // recent cache hits (very simple, allows duplicate entries) static final int DEFAULT_RLENGTH = 10; public Cache() { this( DEFAULT_RLENGTH ); } public Cache( int rlength ) { ht_ = new RdWrMap(); que_ = new java.lang.ref.ReferenceQueue(); rc_ = new _Recent( rlength ); } public Object put( Object key, Object entry ) { rc_.add( entry ); return ht_.put( key, new java.lang.ref.SoftReference( entry, que_ ) ); } public Object try_put( Object key, Object entry ) { ht_.lock.wrlock(); try { if ( !ht_.containsKey( key ) ) { rc_.add( entry ); ht_.put( key, new java.lang.ref.SoftReference( entry, que_ ) ); return entry; } else { Object obj = ((java.lang.ref.Reference)ht_.get( key )).get(); rc_.add( obj ); return obj; } } finally { ht_.lock.unlock(); } } public Object get( Object key ) { try { Object obj = ((java.lang.ref.Reference)ht_.get( key )).get(); rc_.add( obj ); return obj; } catch ( NullPointerException exc ) { return null; } finally { // check the ref.que for ( Object dead = que_.poll(); dead != null; dead = que_.poll() ) ht_.removeValue( dead ); } } private class _Recent { Object[] arr_; int index_; _Recent( int length ) { arr_ = new Object[length]; } synchronized void add( Object obj ) { if ( obj == null ) throw new NullPointerException(); arr_[index_++] = obj; index_ %= arr_.length; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -