前言
首先说一下这个开源框架是做什么的,caffine是一个缓存框架,类似于guava cache,不过比guava性能更高,在jmh测试中同样的线程数,caffine的读写throughput都要比guava要好很多,采用了W-TinyLFU算法(高命中率、低内存占用)
java poet
在caffine当中大量使用了JavaPoet来自动化生成java源码文件。那么JavaPoet是什么呢?这个是一个java api,可以根据注解,数据库的schema,协议格式来自动化生成java的源文件,这样可以避免生成大量重复的模板代码,样例以及详细的JavaPoet的使用方式可以参见它的github主页,https://github.com/square/javapoet
ehcache
ehcache也是一种基于内存的缓存框架,这个框架比较轻量并且依赖比较小,并且可以持久化到硬盘当中。
捕获异常的方式
在看源码的时候我看到在try catch的时候有个符号很有意思,是竖线符号,将两种不同的exception隔开,如下所示:
catch(IOException | SQLException | Exception ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
这个在工作中的代码中没有见过这样的用法,然后就去查了一下。原来这个是java 7之后的特性,可以将上面的捕获异常与java 7之前的如下代码看做是相同的,
catch (IOException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
catch (SQLException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}catch (Exception ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}
用于分隔exception的竖线符号可以认为是linux当中的管道符号。
jmh
这个是一种java微基准测试框架,用于细小粒度的服务测试。这个测试框架一般用于函数的性能测试,方法执行时间,以及优化方面的测试。通过一系列注解来实现用例的测试。比如@BenchmarkMode,@Warmup等等。
ForwardingMap
这个是guava当中的一个类,用的是装饰器模式,作用是将map转发到代理的map上,找了一个例子来说明ForwardingMap的用法
Map map = new HashMap();
ForwardingMap fmap = new ForwardingMap() {
@Override
protected Map delegate() {
return map;
}
};
fmap.put("a", 111);
fmap.put("b", 222);
fmap.put("c", 333);
System.out.println(fmap.entrySet());
使用这个类的好处就是不用考虑map的具体实现
MethodHandler
这个是方法句柄,出现在java7之后,作用类似反射,可以动态获取java中的方法。但是MethodHandler相对于Reflection来说是从字节码层面模拟方法的调用,因此适用于所有jvm语言,但是后者只适用于java。而且MethodHandler要比Reflection要快很多。
LongAdder类
LongAdder类与AtomicLong作用类似,但是在高并发情况下性能更为优异,这是因为AtomicLong采用CAS自旋等待,在高并发下会提高CPU使用,但是LongAdder类会维护一组cell,相当于分段锁。
Unsafe类
这个类的作用有很多,可以直接操作堆外内存,操作对象。也就是说java不能直接操作底层硬件,但是Unsafe类提供了操作底层硬件的方法,由于不会受到java虚拟机的管理,所以会有风险。
AtomicReference类
AtomicReference类都是Atomic操作,类比AtomicInteger,AtomicInteger是对Integer类型的封装,AtomicReference是对于引用的封装
Multiset类
可以放入重复元素的集合
如果对你有帮助,请作者喝一杯牛奶吧