阅读caffine源码收获

阅读caffine源码收获

Posted by irving.gx on February 12, 2021

前言

首先说一下这个开源框架是做什么的,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类

可以放入重复元素的集合


如果对你有帮助,请作者喝一杯牛奶吧