Java缓存架构 guava cache
1. 简述
java cache 是用java实现的缓存工具,其中提供了高效的并发读写功能,对于缓存有两个方面非常重要,一个是缓存的线程安全特性、并发以及缓存的回收特性,今天我们就从线程安全和并发特性来来剖析guava,在分析线程安全、并发特性中,让我们自己来开发一个基于java缓存系统。
2. 实现一个具备线程安全、高并发java缓存系统
假设我们有一个JavaParserUtil类,这个类专门是负责把java文件转换为AST树,我们如何建设一个缓存系统
public class JavaParserUtil {
/**
* 将文件流转换成AST节点
*
* @param file 文件流
* @return AST节点
*/
public ParseResult<CompilationUnit> parse(File file) {
Reader reader = null;
try {
reader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
return new JavaParser().parse(reader);
} catch (ParseProblemException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
第一版
在第一版我们都能设计出这个版本,这个版本的在多线程环境下的并发度非常低,在耗费的时间中在线程堵塞在synchronized。
public class CacheOne {
private static final Map<File, ParseResult<CompilationUnit>> map = new HashMap<>();
public static synchronized ParseResult<CompilationUnit> getCompilationUnit(File file) {
ParseResult<CompilationUnit> value = map.get(file);
if (value == null) {
value = JavaParserUtil.parse(file);
map