Домой Учебники по Java и J2EE Реализация простого Threadsafe Cache с использованием HashMap без использования синхронизированной коллекции

Реализация простого Threadsafe Cache с использованием HashMap без использования синхронизированной коллекции

479
0

Кеш — это область локальной памяти, в которой хранится копия часто используемых данных, которую в противном случае дорого получить или вычислить. Примеры таких данных включают в себя результат запроса к базе данных, файл на диске или отчет.

Вот простой пример Java, который является Threadsafe с использованием HashMap без использования синхронизированных коллекций .

CrunchifyCacheExample.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
пакет ком . crunchify. учебные пособия ;
Импортировать Java. Util. ArrayList ;
Импортировать Java. Util. HashMap ;
Импортировать Java. Util. Итератор ;
Импортировать Java. Util. Карта. Вход ;
/ **
* @author Crunchify.com
*
* /
// Создать объект Simple Cache с помощью HashMap …
общественности учебный класс CrunchifyCacheExample < K , T > {
    
     частный долго timeToLive ;
     частный HashMap < K , T > cacheMap ;
    
     защищенный учебный класс CrunchifyCacheObject {
         общественности долго lastAccessed знак равно Система. currentTimeMillis ( ) ;
         общественности строка стоимость ;
        
         защищенный CrunchifyCacheObject ( String ценность ) {
             это. значение знак равно стоимость ;
         }
     }
    
     общественности CrunchifyCacheExample ( long timeToLive , окончательный долго timeInterval , ИНТ макс ) {
         это. время жить знак равно время жить * 2000 ;
        
         cacheMap знак равно новый HashMap < K , T > ( макс ) ;
        
         если ( timeToLive > 0 && timeInterval> 0) {
            
Поток t = новый поток (новый Runnable () {
public void run () {
while (true) {
пытаться {
Thread.sleep (timeInterval * 1000);
                         } ловить ( InterruptedException ex ) {
                         }
                        
                     }
                 }
             } ) ;
            
             т . setDaemon ( true ) ;
             т . начало ( ) ;
         }
     }
    
     // метод PUT
     общественности недействительным положить ( K ключ , T ценность ) {
         синхронизированный ( cacheMap ) {
             cacheMap . положить ( ключ , значение ) ;
         }
     }
    
     // метод GET
     @SuppressWarnings ( не проверено )
     общественности T получить ( K ключ ) {
         синхронизированный ( cacheMap ) {
             CrunchifyCacheObject с знак равно ( CrunchifyCacheObject ) cacheMap . получить ( ключ ) ;
            
             если ( с == ноль )
                 вернуть ноль ;
             еще {
                 с . lastAccessed знак равно Система. currentTimeMillis ( ) ;
                 вернуть ( T ) с . стоимость ;
             }
         }
     }
    
     // УДАЛИТЬ метод
     общественности недействительным удалить ( строка ключ ) {
         синхронизированный ( cacheMap ) {
             cacheMap . удалить ( ключ ) ;
         }
     }
    
     // Получить размер кэша объектов ()
     общественности ИНТ размер ( ) {
         синхронизированный ( cacheMap ) {
             вернуть cacheMap . размер ( ) ;
         }
     }
    
     // метод CLEANUP
     общественности недействительным очистка ( ) {
        
         долго сейчас знак равно Система. currentTimeMillis ( ) ;
         ArrayList DeleteKey знак равно ноль ;
        
         синхронизированный ( cacheMap ) {
             Итератор > ITR знак равно cacheMap . entrySet ( ) . итератор ( ) ;
            
             DeleteKey знак равно новый ArrayList < String > ( ( cacheMap . Size ( ) / 2 ) + 1 ) ;
             CrunchifyCacheObject с знак равно ноль ;
            
             в то время как ( итр . hasNext ( ) ) {
                 строка ключ знак равно ( Строка ) итр . следующий ( ) ;
                 с знак равно ( CrunchifyCacheObject ) ((Запись ?> ) итр ) . getValue ( ) ;
                 если ( с ! знак равно ноль && (сейчас> (timeToLive + c.lastAccessed))) {
deleteKey.add (ключ);
                 }
             }
         }
        
         за ( Строка ключ : deleteKey ) {
             синхронизированный ( cacheMap ) {
                 cacheMap . удалить ( ключ ) ;
             }
            
             Thread. yield ( ) ;
         }
     }
}

Еще несколько примеров Java, которые вы можете посмотреть.

Бонус: детали модели памяти Java:

Реализация простого Threadsafe Cache с использованием HashMap без использования синхронизированной коллекции

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Сравнение Java eNum с использованием оператора Equals (==), оператора Switch-Case и метода .equals () - полное руководство

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь