天天看点

线程上下文类加载器和volatile

线程的上下文类加载是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内存模型一样也是一个抽象概念,实际并不存在,它涵盖了缓存,寄存器、编译器优化以及硬件等。
  • 希望能交流更多技术,关注小白的微信公众号吧。
    线程上下文类加载器和volatile