线程的上下文类加载是JDK1.2开始引进,分别获取和设置当前线程的上下文类加载,如果没有设置,那么就会和父线程的类加载器保持一致。
为什么要有线程上下文类加载器?
- Jvm的双亲加载即有一定缺陷,JDK核心类库提供很多spi,包括jdbc、jbi、JCE等等,Jdk只规定了这些接口之间的逻辑关系,但不提供具体实现。
例如:Jdbc这个类库在加载的时候想要实现透明化,又不想与JDK核心库绑定,但是由于双亲委托机制的限制,启动类加载器不可能加载到第三方厂商提供的具体实现。为了解决这个缺陷,JDK只能提供一种不怎么好的方式–线程上下文类加载,委托子类加载器加载第三方厂商的具体实现。
了解volatile之前需要了解一下计算机的cpu情况:
CPU是计算机的核心,所有计算运行的时候都是有CPU寄存器完成的,CPU指令的执行过程需要涉及数据的读取和写入,但内存速度跟不上cpu的速度,这时候就需要CPU Cache ,cpu的缓存分为三级,每一级的数据量不一样,这就出现CPU的缓存一致问题。
目前解决缓存不一致问题有:
- 通过总线加锁的方式
- 缓存一致性的协议
Java内存模型
指定了Java虚拟机如何向计算机内存进行工作。
其定义了线程和内存之间的抽象关系:
- 共享变量存储于主内存之间,每个线程都能访问。
- 每个线程都有私有的工作内存或者成为本地内存
- 工作内存只存储该线程对共享变量的副本
- 线程至于先操作了工作内存才可以操作主内存
- 工作内存和Java内存模型一样也是一个抽象概念,实际并不存在,它涵盖了缓存,寄存器、编译器优化以及硬件等。
- 希望能交流更多技术,关注小白的微信公众号吧。