java

生产问题之CaffeineCache使用中的坑

问题描述 服务缓存中使用CaffeineCache时,通过CaffeineCache在数据更新并且超过refreshAfterWrite时间后首次获取缓存时,偶发性的获取不到最新的缓存 实现 public class CaffeineCacheTest { public static void main(String[] args) throws Exception { CaffeineCacheTest test = new CaffeineCacheTest(); Cache cache = test.caffeineCacheManager().getCache("test"); CacheObject cacheObject = (CacheObject) cache.get(

  • 凯文
3 min read
java

响应式编程RxJava之Single

简单入门 Single.just(T value); 通常使用RxJava,主要是为了异步处理一些任务。即传入一些值,经过逻辑处理之后返回结果。 以上代码中的just(T value),可以看作是传入参数。 有了输入,如何输出呢?我们讲到了异步处理,那自然得有一个异步回调才行吧,这简直理所应当吧。所以这里介绍最重要的"subscribe"概念。 Single.just(T value).subscribe(); 例如: int addValue(int a,

  • 凯文
8 min read
java

reactor响应式编程之 Mono & flux

Publisher 由于响应流的特点,我们不能再返回一个简单的POJO对象来表示结果了。必须返回一个类似Java中的Future的概念,在有结果可用时通知消费者进行消费响应。 Reactive Stream规范中这种被定义为Publisher<T> ,Publisher<T>是一个可以提供0-N个序列元素的提供者,并根据其订阅者Subscriber<? super T>的需求推送元素。一个Publisher<T>可以支持多个订阅者,并可以根据订阅者的逻辑进行推送序列元素。下面这个Excel计算就能说明一些Publisher<T>的特点。 Publisher&

  • 凯文
5 min read
java

响应式编程之RxJava VS Reactor

目前市场上比较流行的有几种,RxJava,Akka,Vert.x,Reactor。最常使用的两种框架,并且实现了响应式编程规范的是RxJava和Reactor。 两者之间有什么区别呢? API Flowable和FluxAPI很相似都支持,ReactiveX常见的那些操作符。map,filter,flatmap等等,具体操作符列表:http://reactivex.io/documentation/operators.html 在Java版本上: RxJava2.x必须至此Java 6,因为它Rxjava在安卓中用的很多 Reactor则至少要求Java 8. 其内部利用了很多新版Java的特性。并且还可以方便的转换为:CompletableFuture,java.

  • 凯文
4 min read
java

jvm类的加载及方法调用过程

类的加载过程 加载 加载是指查找字节流,并且据此创建类的过程。 加载需要借助类加载器,在 Java 虚拟机中,类加载器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器。 链接 验证:确保被加载类能够满足 Java 虚拟机的约束条件 准备:为被加载类的静态字段分配内存;部分 Java 虚拟机还会在此阶段构造其他跟类层次相关的数据结构,比如说用来实现虚方法的动态绑定的方法表 解析:将符号引用解析成为实际引用;如果符号引用指向一个未被加载的类,或者未被加载类的字段或方法,那么解析将触发这个类的加载(但未必触发这个类的链接以及初始化。) 初始化 常量值(ConstantValue)初始化直接由 Java

  • 凯文
7 min read
java

Java 虚拟机执行Java 字节码过程

Java 虚拟机具体是怎样运行 Java 字节码的 java类加载 从虚拟机视角来看,执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。 如果你熟悉 X86 的话,你会发现这和段式内存管理中的代码段类似。而且,Java 虚拟机同样也在内存中划分出堆和栈来存储运行时数据。 不同的是,Java 虚拟机会将栈细分为面向 Java 方法的

  • 凯文
5 min read
java

java-mysql时区问题

问题 数据库时间展示正常,但是web页面时间与数据库时间差 13/14 个小时 原因 mysql采用的是CST时区,而java使用的是北京时间,两个时区有时差13个小时有时差14个小时,故从数据库查出数据后,如果直接展示无问题,但是如果通过java程序 SimpleDateFormat转换,就会出现问题 解决方案 在通过SimpleDateFormat转换时间时,设置时区为 CST 此方案,后续所有使用SimpleDateFormat转换数据库时间时,都需要指定TimeZone 但是通过SimpleDateFormat转换非数据库date(如 当前date)时,不需要指定TimeZone format.setTimeZone(TimeZone.getTimeZone("CST&

  • 凯文
1 min read
java

spring bean factory介绍

问题 singletonObjects与earlySingletonObjects的作用 如果singletonFactories中存放的内容 如何解决循环引用问题 aop对应的代理类如何保存实例 spring 缓存 singletonObjects-一级缓存 private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); spring 单例对象集合,所有的实例实例化完成后均需要保存在该变量中,该变量的key为bean name,value为spring管理的实例 在spring 创建实例完成后,添加至该缓存中,并且将该实例从earlySingletonObjects中移除,且将该实例对应的factory从singletonFactories中移除 singletonFactories-三级缓存

  • 刘凯
2 min read
java

synchronized详解

问题 某实例未执行过锁代码块,该实例的标识位是101还是001? 轻量级锁和重量级锁执行完成锁代码块后的标识位分别是什么? 轻量级锁执行完锁代码块后,出现其他线程竞争锁,该线程竞争成功后是什么锁? synchronized是否可降级? java对象Mark Word 32位Header Mark Word 即32bit,4个字节 64位Header Mark Word |------------------------------------------------------------------------------|--------------------| | Mark Word (64 bits) | State | |------------------------------------------------------------------------------|--------------------| | unused:25 | identity_hashcode:31 | unused:

  • 凯文
9 min read
java

java基础之二进制存储

原码、反码和补码 在计算机内,定点数有3种表示法:原码、反码和补码 原码 二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码 正数的反码与其原码相同; 负数的反码是对其原码逐位取反,但符号位除外;即对其原码的绝对值取反,如 10001010的反码为11110101 补码 正数的补码与其原码相同;负数的补码是在其反码的末位加1。 byte jvm byte存储方式 Java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“

  • 凯文
3 min read
java

Sychronized实现原理

sychronized class反编译 在源代码层面,似乎看不出synchronized的实现原理。锁与不锁的区别,似乎仅仅只是有没有被synchronized修饰。不如把目光放到更加底层的汇编上,看看能不能找到突破口。 javap 是官方提供的.class文件分解器,它能帮助我们获取.class文件的汇编代码。具体用法可参考这里。 接下来我会使用javap命令对*.class文件进行反汇编。 编写文件Test.java: public class Test { private int i = 0; public void addI_1(){ synchronized (this){ i++; } } public

  • 凯文
5 min read
java

synchronized&monitor

synchronized、monitor、wait、notify Synchronize是java中解决并发问题比较常用的一种方法。从语法上面来说synchronized总共有三种用法。修饰普通方法,修饰静态方法,和同步代码块。 我们对同步代码块的方法进行反编译,可以发现,在synchronized囊括的代码中分别有monitorenter和monitorexit两个指令。虚拟机规范中对着两个指令如下描述:每个对象都有一个monitor。当monitor被占用的时候就会处于锁定状态。当线程monitorenter指令尝试获取monitor所有权时,如果进入数为0,则该线程进入,将进入数设置为1,该线程几位monitor的所有者。其他的线程在进入的时候就会进入阻塞状态,知道monitor的进入数量为0.而monitorexit会对进入数量减1,当变为0的时候,monitor就不再被这个线程占用。 而对synchronize修饰的方法反编译的时候发现,方法没有在使用monitorenter和monitorexit来实现,但是在方法的flags中acc——synchronized的标志。当调用acc_synchronize标志的方法的时候也会先去获取monitor对象,所以本质上和同步代码块是一样的。 同步代码块的monitor来自指定对象,

  • developer
3 min read
java

Mybatics执行过程

mybatics mapper的注入过程 在使用mybatics时,通过MapperScan注解 import registrar MapperScannerRegistrar 在MapperScannerRegistrar中会对 ClassPathMapperScanner进行初始化,如setMapperFactoryBean,setSqlSessionTemplateBeanName,setSqlSessionFactoryBeanName等;然后调用ClassPathMapperScanner.doScan方法 在doScan方法中会扫描所有的Mapper,并通过MapperFactoryBean生成对应的代理类,然后将该类注册到spring bean factory中,在初始化BeanDefinition时,会通过RuntimeBeanReference添加需要的属性,如sqlSessionTemplate,sqlSessionFactory等,而sqlSessionTemplate,sqlSessionFactory是在MybatisAutoConfiguration中注入到BeanFactory中的。 MapperFactoryBean继承了SqlSessionDaoSupport,在spring 创建MapperFactoryBean会通过sqlSessionTemplate或sqlSessionFactory生成sqlSession 在执行某个mapper时,执行的是动态代理类,代理类为MapperProxy,该类的getObject()方法通过sqlSession.

  • 凯文
3 min read