ReZero's Utopia.

Java tricks

Word count: 498Reading time: 1 min
2021/03/04 Share
  1. 通过块来进行标量复用方便回收。注意的是在 未经过JIT编译前且块后未对局部变量进行读写,则可能仍然无法回收。

  2. 通过扫描 WAIT 线程,减少不必要的WAIT 线程 进而减少 WAIT到RUNNABLE 状态发生的上下文切换造成的性能损耗

  3. Collection.toArray 会转换为 Object 数组,因此最好穿个额外的参数 比如 new String[0],这样可以表明类型,还不占用空间

  4. 协变与逆变: PECS producer extends & consumer super <? super Apple> 限定的是下界,即扔进去的都是 Apple 的子类,这样就可以取的时候用 Apple
    引用取,但如果扔进去 Apple
    的父类,取的时候就不知道是哪个辈,可能用 Apple
    爹持有了Apple 爷,Java 不许子类持有父类,因而不允许。同样的 <? extends Apple> 限定的是 Apple 上界,因为上界是 Apple了,那么自然可以用任意的 Apple 及 Apple
    的 爹爷辈来取;但不能往里面放 Apple 的儿辈。

    1
    2
    class SelfBounded<T extends SelfBounded<T>> { // ... 
    // 子类重写父类方法,非泛型只能重载
  1. BatchInsert: 考虑生成字节码生成 toString 等作为批量插入values预生成方案检测sql长度等, 插入的多线程要逼近IO前提,而不是无脑的加,高于DB磁盘等的IO限制是无意义的加。侧重IO
    时要考虑下协程的使用,一般来说协程在IO
    方面的并发效率是优于线程的。既然考虑了线程池,线程池的参数也就需要考量了,基本做可以做成配置中心动态发布生效的效果,如果能达到监控业务场景合理自动调整配置最好。对于队列,考虑要用同步队列比较好,这样没有任务被缓存下来,所有的任务都立刻得到执行,效果自然会拔高。

CATALOG