化物的英文译语怎么说-动词不定式
2023年4月5日发(作者:新概念英语第二册视频下载)
Java并发编程:ConcurrentHashMap的使⽤,实现⼀个简单的缓
存⼯具类
概述
ConcurrentHashMap是线程安全且⾼效的HashMap
问:为什么使⽤ConcurrentHashMap?
在并发编程中使⽤HashMap,会出现ConcurrentModificationException异常、会引起程序死循环等情况。使⽤线程安全的Hashtable的话效
率太低,ConcurrentHashMap保证了线程安全的同时⼜保证了⾼效的操作。
多线程下,HashMap为什么会出现死循环?
HashMap出现死循环java7和java8不太⼀样。
java7出现在扩容的场合,因为头插法导致链表死循环,java8使⽤了数组+链表+红⿊树以及尾插法修复了这个问题,不过在PutTreeValue的时
候可能会出现Node节点转换为TreeNode结点异常,所以多线程下不要使⽤HashMap。
使⽤ConcurrentHashMap实现本地缓存
1.创建包:r1,并创建缓存实体类CacheObj
r1;
/**
*@ClassNameCacheObj
*@Description//缓存对象类
*@AuthorsingleZhang
*@*********************
*@Date2020/12/240024下午3:30
**/
publicclassCacheObj{
/**
*缓存对象
*/
privateObjectCacheValue;
/**
*缓存过期时间
*/
privateLongexpireTime;
CacheObj(ObjectcacheValue,LongexpireTime){
CacheValue=cacheValue;
Time=expireTime;
}
ObjectgetCacheValue(){
r遁形的意思 eturnCacheValue;
}
LonggetExpireTime(){
returnexpireTime;
}
@Override
publicStringtoString(){
return\"CacheObj{\"+
\"CacheValue=\"+CacheValue+
\",expireTime=\"+expireTime+
\'}\';
}
}
2.创建过期缓存清理线程类CleanCacheThread
r1;
/**
*@ClassNameCleanCacheThread
*@De世说新语 scription//清理过期缓存线程
*@AuthorsingleZhang
*@*********************
*@Date2020/12/240024下午3:37
**/
publicclassCleanCacheThreadimplementsRunnable{
@Override
publicvoidrun(){
anThrea飞花两岸照船红的参照物 dRun();
while(true){
n(\"cleanthreadrun\");
TimeOut();
try{
(_MINUTE);
}catch(InterruptedExceptione){
tackTrace();
}
}
}
}
3.创建ConcurrentHashMap缓存⼯具类ConcurrentHashMapCacheUtil
r1;
;
Factory;
List;
;
;
rentHashMap;
/**
*@ClassNameConcurrentHashMapCacheUtil
*@Description//使⽤ConcurrentHashMap做本地缓存
*@AuthorsingleZhang
*@*********************
*@Date2020/12/240024下午3:23
**/
publicclassConcurrentHashMapCacheUtil{
privatestaticLoggerLOGGER=ger();
/**
*缓存最⼤个数
*/
privatestaticfinalIntegerCACHE_MAX_NUMBER=1000;
/**
*当前缓存个数
*/
privatestaticIntegerCURRENT_SIZE=0;
/**
*时间⼀分钟
*/
staticfinalLongONE_MINUTE=60*1000L;
/**
*缓存对象
*/
privatestaticfinalMap
/**
*这个记录了缓存使⽤的最后⼀次的记录,最近使⽤的在最前⾯
*/
*/
privatestaticfinalList
/**
*清理过期缓存是否在运⾏
*/
privatestaticvolatileBooleanCLEAN_THREAD_IS_RUN=false;
/**
*设置缓存
*/
publicstaticvoidsetCache(StringcacheKey,ObjectcacheValue,longcacheTime){
LongexpireTime=null;
if(cacheTime<=0L){
if(cacheTime==-1L){
expireTime=-和盘托出 1L;
}else{
return;
}
}
checkSize();
saveCacheUseLog(cacheKey);
CURRENT_SIZE=CURRENT_SIZE+1;
if(expireTime==null){
expireTime=tTimeMillis()+cacheTime;
}
CacheObjcacheObj=newCacheObj(cacheValue,expireTime);
CACHE_OBJECT_(cacheKey,cach小学一年级古诗大全带拼音免费 eObj);
(\"havesetkey:\"+cacheKey);
}
/**
*设置缓存
*/
publicstaticvoidsetCache(StringcacheKey,ObjectcacheValue){
setCache(cacheKey,cacheValue,-1L);
}
/**
*获取缓存
*/
publicstaticObjectgetCache(StringcacheKey){
startCleanThread();
if(checkCache(cacheKey)){
saveCacheUseLog(cacheKey);
returnCACHE_OBJECT_(cacheKey).getCacheValue();
}
returnnull;
}
publicstaticbooleanisExist(StringcacheKey){
returncheckCache(cacheKey);
}
/**
*删除所有缓存
*/
publicstaticvoidclear(){
(\"havecleanallkey!\");
CACHE_OBJECT_();
CURRENT_SIZE=0;
}
/**
*删除某个缓存
*/
publicstaticvoiddeleteCache(StringcacheKey){
ObjectcacheValue=CACHE_OBJECT_(cacheKey);
if(cacheValue!=null){
(\"havedeletekey:\"+cacheKey);
CURRENT_SIZE=CURRENT_SIZE-1;
}
}
/**
*判断缓存在不在,过没过期
*/
privatestaticbooleancheckCache(StringcacheKey){
CacheObjcacheObj=CACHE_OBJECT_(cacheKey);
if(cac分辨的反义词有哪些 heObj==null){
returnfalse;
returnfalse;
}
if(ireTime()==-1L){
returntrue;
}
if(ireTime()
deleteCache(cacheKey);
returnfalse;
}
returntrue;
}
/**
*删除最近最久未使⽤的缓存
*/
privatestaticvoiddeleteLRU(){
(\"deleteLeastrecentlyusedrun!\");
StringcacheKey=null;
synchronized(CACHE_USE_LOG_LIST){
if(CACHE_USE_LOG_()>=CACHE_MAX_NUMBER-10){
cacheKey=CACHE_USE_LOG_(CAC赞美老师的诗句现代诗 HE_USE_LOG_()-1);
}
}
if(cacheKey!=null){
deleteCache(cacheKey);
}
}
/**
*删除过期的缓存
*/
staticvoidd江雪古诗视频朗读视频 eleteTimeOut(){
(\"deletetimeoutrun!\");
List
for(
if(ue().getExpireTime()
(());
}
}
for(StringdeleteKey:deleteKeyList){
deleteCache(deleteKey);
}
(\"deletecachecountis:\"+());
}
/**
*检查⼤⼩
*当当前⼤⼩如果已经达到最⼤⼤⼩
*⾸先删除过期缓存,如果过期缓存删除过后还是达到最⼤缓存数⽬
*删除最久未使⽤缓存
*/
privatestaticvoidcheckSize(){
if(CURRENT_SIZE>=CACHE_MAX_NUMBER){
deleteTimeOut();
}
if(CURRENT_SIZE>=CACHE_MAX_NUMBER){
deleteLRU();
}
}
/**
*保存缓存的使⽤记录
*/
privatestat唯有相思不可医 icsynchronizedvoidsaveCacheUseLog(StringcacheKey){
synchronized(CACHE_USE_LOG_LIST){
CACHE_USE_LOG_(cacheKey);
CACHE_USE_LOG_(0,cacheKey);
}
}
/**
*设置清理线程的运⾏状态为正在运⾏
*/
staticvoidsetCleanThreadRun(){
CLEAN_THREAD_IS_RUN=true;
}
}
/**
*开启清理过期缓存的线程
*/
privatestaticvoidstartCleanThread(){
if(!CLEAN_THREAD_IS_RUN){
CleanCacheThreadcleanCacheThread=newCleanCacheThread();
Threadthread=newThread(cleanCacheThread);
//设置为后台守护线程
mon(true);
();
}
}
}
如此,就完成了⼀个简单的缓存类
更多推荐
concurrent是什么意思current在线翻译读音
发布评论