快速点击StartActivity引发的误会

问题来源





在A 跳到 B ,再跳到C的过程中,一定条件下发送广播,需要把B关掉,达到的效果就是 C直接返回A。


但是现在出现一个Bug就是C返回的时候,还是B。当时没有打印onCreate的日志,只发现B在前面finish了,居然又在后面onResume了,这显然违反科学。当时想就算B启动了多个,B也都在onCreate的时候注册了广播,都应该可以收到广播的。后面怀疑是手滑不小心点击了2次,或是系统突然响应过慢,点击了多次,造成创建了多个实例,所以我直接通过for循环快速模拟这种情况。

阅读更多

从ContextClassLoader到JDBC和SPI

SystemClassLoader

可以jvm参数 java.system.class.loader 设置默认的系统加载器,默认是当前线程的ContextClassLoader。来自sun.misc.Launcher.getLauncher的getClassLoader, 而getLauncher的getClassLoader实际来自Launcher.AppClassLoader.getAppClassLoader。

阅读更多

记一次类加载引起的Bug

1.起因

程序莫名其妙出了
error:java.lang.NullPointerException: Null reference used for synchronization (monitor-enter)
就是在使用同步锁的时候,是锁的对象是空的。很是奇怪,看代码没觉得啊。打印一下,确实是空的,Why?

阅读更多

Ubuntu编译glibc库来验证Synchronized锁优化效果

0.前言


当然你可以说通过JOL查看对象的头信息,当然那个也是一种方法,但那个只能说明是这种状态,没有过程,本次主要结合来验证,Synchronized 关键字锁的状态:无锁、偏向锁、轻量级锁、重量级锁

基于Ubuntu16测试成功。18测试失败,centos没有测试




主要是在Java调用系统函数的时候,打印log。但是在Java里面打印线程ID是JVM层面的。需要自己实现一个native方法,在java层面调用。最后对比对应的PID 和TID,发现查看当前线程调用了几次系统锁
Java 的重量级级锁都是通过glibc库的pthread_mutex_lock函数实现的,是在和操作系统级别的锁。

阅读更多