java 类加载机制
     java 虚拟机把形容类的数据从 Class 文件加载到内存,并对数据进行校验,解析和初始化,最终造成能够被虚拟机间接应用的 java 类型。
      什么是类加载器,有哪些?
实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。
次要有一下四品种加载器:
      类加载器分类:
启动类加载器(Bootstrap ClassLoader)、加载外围 java 代码的扩大类加载器(Extension ClassLoader)、加载扩大的 java 代码 (非核心代码如日志、图形化等类)启动类加载器、(Bootstrap ClassLoader)加载咱们写的类自定义类加载器、(User ClassLoader)个别框架会自定义类加载器,如 Tomcat
      双亲委派模型,如果一个类加载器收到了类加载的申请,它首先不会本人去加载这个类,而是把这个申请委派给父类加载器去实现,每一层的类加载器都是如此,这样所有的加载申请都会被传送到顶层的启动类加载器中,只有当父加载无奈实现加载申请(它的搜寻范畴中没找到所需的类)时,子加载器才会尝试去加载类。
乐观锁和乐观锁:
      乐观锁概念乐观锁与乐观锁是一种狭义上的概念,体现了对待线程同步的不同角度。在 Java 和数据库中都有此概念对应的理论利用。乐观锁 / 乐观锁区别乐观锁对于同一个数据的并发操作,乐观锁认为本人在应用数据的时候肯定有别的线程来批改数据,因而在获取数据的时候会先加锁,确保数据不会被别的线程批改。Java 中,synchronized 关键字和 Lock 的实现类都是乐观锁。乐观锁而乐观锁认为本人在应用数据时不会有别的线程批改数据,所以不会增加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,以后线程将本人批改的数据胜利写入。如果数据曾经被其余线程更新,则依据不同的实现形式执行不同的操作(例如报错或者主动重试)。乐观锁实现乐观锁在 Java 中是通过应用无锁编程来实现,最常采纳的是 CAS 算法,Java 原子类中的递增操作就通过 CAS 自旋实现的。
概念:
     CAS 全称 Compare And Swap(比拟与替换),是一种无锁算法。在不应用锁(没有线程被阻塞)的状况下实现多线程之间的变量同步。java.util.concurrent 包中的原子类就是通过 CAS 来实现了乐观锁。
      实现 CAS 算法波及到三个操作数:须要读写的内存值 V。进行比拟的值 A。要写入的新值 B。
      当且仅当 V 的值等于 A 时,CAS 通过原子形式用新值 B 来更新 V 的值(“比拟 + 更新”整体是一个原子操作),否则不会执行任何操作。个别状况下,“更新”是一个一直重试的操作。之前提到 java.util.concurrent 包中的原子类(AtomicInteger 等类),就是通过 CAS 来实现了乐观锁 CAS 问题
ABA 问题:
     CASCAS 须要在操作值的时候查看内存值是否发生变化,没有发生变化才会更新内存值。然而如果内存值原来是 A,起初变成了 B,而后又变成了 A,那么 CAS 进行查看时会发现值没有发生变化,然而实际上是有变动的。
     CAS 的 ABA 问题的解决思路就是在变量后面增加版本号,每次变量更新的时候都把版本号加一,这样变动过程就从“A-B-A”变成了“1A-2B-3A”。循环工夫长开销大。CAS 操作如果长时间不胜利,会导致其始终自旋,给 CPU 带来十分大的开销。