泛型的反序列化

简化问题

日常使用过程中,我们经常碰到泛型的序列化Json,但是有时候我们需要把一个Json反序列化成一个泛型对象,怎么做,你可能会想到这样做,例如在Gson中

1
Gson().fromJson<List<String>>(JsonString, List<String>::class.java)
阅读更多

Json转Map的后出现ClassCastException

运行错误

测试代码

1
2
3
4
5
6
7
8
9
10
import com.google.gson.Gson
fun main() {
val map = HashMap<String, Int>()
map["key1"] = 111111
val jsonString = Gson().toJson(map)
println(map::class.java)
val hashMap = Gson().fromJson(jsonString, map::class.java)
val key1:Int? = hashMap["key1"]
println(key1)
}

运行的时候,会抛类型转换错误

阅读更多

从ContextClassLoader到JDBC和SPI

SystemClassLoader

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

阅读更多

深挖CAS的底层实现

前言

代码层面,所有的锁在cpu层面都是一条条的指令,所有最终所有的锁,都要考底层指令的支持,CAS是代码层面比较常用的一种“无锁”,实际对应于cpu里面的几条指令,当然一个cpu有多个核下是如何解决锁的。在单核的时候,还可以通过关闭中断,来阻止操作系统调度。但是在多核的情况下,各个cpu是并行执行的,因此这个时候,就会出现,同时获取到锁的状态,而这个时候,通过禁止中断,是没有效果的,就需要引入一种机制实现多核本地缓存失效和内存全局的锁,涉及多级缓存的失效与同步,其实在计算机组成原理与操作系统里面有学的。

阅读更多

记一次类加载引起的Bug

1.起因

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

阅读更多

如何定位CPU占用最高的代码块?

1. 先利用top查看 占用较高的进程

2 。利用 top -Hp pid 或 ps H -p pid -o pid,tid,pmem,pcpu,time,comm。查看某个进程中的线程占用CPU的情况。

3. 利用jstack pid 对应某个线程,注意 jstack 中的 nid 是16进制的,注意转换。

4.可以在线程启动的时候,设置线程的name,方便快速定位。

类加载器之间的关系

本次我们主要讨论子类和父类的类加载器之前的关系, 以及包含之前的类加载器关系。
我们自定义一个classloder,设置父加载器为null,这样保证都是自己来加载,指向的路径和AppClassloader一致,这样方便2个都好直接加载

阅读更多