Synchronized Collection을 사용하지 않고 HashMap을 사용하여 Simple Threadsafe Cache 구현
게시 됨: 2013-11-29캐시는 자주 액세스하거나 계산하는 데 비용이 많이 드는 데이터 복사본을 보유하는 로컬 메모리 영역입니다. 이러한 데이터의 예로는 데이터베이스, 디스크 파일 또는 보고서에 대한 쿼리 결과가 있습니다.
다음은 동기화된 컬렉션을 사용하지 않고 HashMap을 사용하여 스레드로부터 안전한 간단한 Java 예제입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
package com . crunchify . tutorials ; import java . util . ArrayList ; import java . util . HashMap ; import java . util . Iterator ; import java . util . Map . Entry ; /** * @author Crunchify.com * */ // Create Simple Cache object with the help of HashMap... public class CrunchifyCacheExample < K , T > { private long timeToLive ; private HashMap < K , T > cacheMap ; protected class CrunchifyCacheObject { public long lastAccessed = System . currentTimeMillis ( ) ; public String value ; protected CrunchifyCacheObject ( String value ) { this . value = value ; } } public CrunchifyCacheExample ( long timeToLive , final long timeInterval , int max ) { this . timeToLive = timeToLive * 2000 ; cacheMap = new HashMap < K , T > ( max ) ; if ( timeToLive > 0 && timeInterval > 0) { Thread t = new Thread(new Runnable() { public void run() { while (true) { try { Thread.sleep(timeInterval * 1000); } catch ( InterruptedException ex ) { } } } } ) ; t . setDaemon ( true ) ; t . start ( ) ; } } // PUT method public void put ( K key , T value ) { synchronized ( cacheMap ) { cacheMap . put ( key , value ) ; } } // GET method @SuppressWarnings ( "unchecked" ) public T get ( K key ) { synchronized ( cacheMap ) { CrunchifyCacheObject c = ( CrunchifyCacheObject ) cacheMap . get ( key ) ; if ( c == null ) return null ; else { c . lastAccessed = System . currentTimeMillis ( ) ; return ( T ) c . value ; } } } // REMOVE method public void remove ( String key ) { synchronized ( cacheMap ) { cacheMap . remove ( key ) ; } } // Get Cache Objects Size() public int size ( ) { synchronized ( cacheMap ) { return cacheMap . size ( ) ; } } // CLEANUP method public void cleanup ( ) { long now = System . currentTimeMillis ( ) ; ArrayList <String> deleteKey = null ; synchronized ( cacheMap ) { Iterator <? > itr = cacheMap . entrySet ( ) . iterator ( ) ; deleteKey = new ArrayList < String > ( ( cacheMap . size ( ) / 2 ) + 1 ) ; CrunchifyCacheObject c = null ; while ( itr . hasNext ( ) ) { String key = ( String ) itr . next ( ) ; c = ( CrunchifyCacheObject ) ( ( Entry <? , ?> ) itr ) . getValue ( ) ; if ( c ! = null && (now > (timeToLive + c.lastAccessed))) { deleteKey.add(key); } } } for ( String key : deleteKey ) { synchronized ( cacheMap ) { cacheMap . remove ( key ) ; } Thread . yield ( ) ; } } } |
당신이 보고 싶어할 수 있는 몇 가지 더 많은 Java 예제.
