• jvm类加载机制,双亲委派机制,juc


    jvm类加载机制

    类加载机制是指把编译后的.class类文件的二进制数据读取到内存中,并为之创建一个java.lang.Class对象,用来封装类在元数据空间的数据结构。

    类jvm中的生命周期为 加载,连接,初始化和使用和卸载。

    1.加载过程

    加载是将类得class文件读入到内存,并未指创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之简历一个java.lang.class对象。

       类的加载有类加载器王城,类加载器通常由JVM提供,JVM中由许多类加载器。也可以自行通过继承ClassLoader基类来创建自己得类加载器。

           通过使用不同得类加载器,可以从不同来源加载类得二进制数据。

         本地文件系统加载class文件,这是钱买你绝大分实列程序类加载方式。

    jar包加载class文件,这种也是恒常见得,钱买你介绍jdbc编程时候用到的数据库驱动类就放在jar文件中,jvm也可以从jar文件中加载该class文件。

    通过网络加载class文件。

    把一个java元文案金动态编译,并执行加载。

    类加载器通常无需等到“首次使用”该类时才加载该类,java虚拟机规范允许系统预先加载某些类。

    2.链接

           当类被加载之后,系统位置生成一个对应的class对象,接着将会进入连接阶段,连接阶段负责将类的二进制数据合并到jre中。类连接又可以分如下3个阶段。

            1)验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致。

    java时相对c++语言时安全的,拥有数组越界的检查。 验证文件格式,元数据验证,字节码验证,符号引用验证。

     2).准备:类准备阶段负责为类的静态变量分配内存,并设置默认初始值。

    3)解析:将类的二进制数据中的符号替换成直接引用。 符号引用是以一组符号来描述引用的目标,符号可以是任何字面形式的字面量,只要不会出现冲突能够定位就行。

    直接引用:指向目标的指针,偏移量或者能够直接定位的句柄。

    3.初始化

           初始化是类的静态变量赋予正确的初始值,准备和初始化阶段看似有点矛盾,

    一个语句 ,  prive static int b= 9 

    加载:首先是字节码被加载到内存后,验证:先进行连接验证这一步,验证通过准备阶段:给b分配内存。解析:    初始化:才将9赋值给b

    双亲委派机制:如果一个类加载器收到了类加载请求,不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进异步向上委托,依次递归。最终将到达顶层的的类加载器,如果不能够完成加载任务,那么这就是双亲委派模式,即每个儿子都很懒,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子自己才想办法去完成。

    双亲委派机制的优势:采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

    juc并发编程

    JUC来源于java.util.concurrent\java.util.atomic\java.t=util.concurrent.locks这三个包(简称juc),在这些包中增加了并发便哼中哼唱用的使用工具类,用于定义类似线程的自定义子系统,包括线程池、异步io和轻量级任务框架。提供可调、林火的线程池。还提供了设计用多线程上下文中的collection实现等。

    进程、线程的关系

    进程包含多个线程,打的cf,lol游戏,在任务管理器就是一个进程。

    java的两个默认线程4

    main函数执行的线程和Gc垃圾回收的线程。

    线程的六种状态

    新生new

    运行Runnable

    阻塞Blocked等待

    watting

    timed_waitting

    终止terminated

      

    并发、并行的关系:

    并发(多个线程操作一个资源)

    并行:cpu多核,多个线程可以同时执行

    LOCK锁

    lock锁是一个接口,实现类:

    RenntrantLock(可重入锁)

    ReentranReadWriteLock.ReadLock (可重入读写锁中的读锁)

    ReentranReadWriteLock。WriteLock(可重入读写锁中的写锁)

                    Synchronized和Lock区别 

    1.来源不同synchronize 是java内置的关键子,在jvm层;lock是java的一个接口。

    2.synchronize 是自动获取锁,不能够判断锁的状态;lock,手动获取锁,可判断是否获取到锁。

    线程阻塞方面
    3.3synchronize => 线程1阻塞会导致线程2永远等待;Lock=>不一定会等下去
    锁得类型不同
    .synchronize=>可重入锁、不可中断、非公平;Lock=>可重入锁、可判断锁、非公平(可设4置成公平)
    使用范围不同
    synchronize=>适用于少量代码块同步;Lock=>适合锁大量的同步代码块

             

  • 相关阅读:
    Visual Studio Code使用
    云原生之深入解析Kubernetes Pod如何获取IP地址
    Python:实现随机正态分布快速排序算法(附完整源码)
    搜索引擎研究-如何分词-高级分词-基础分词后组合复合词汇
    PyCharm运行Nosetests并导出测试报告
    nexus创建Maven私服图文教程
    异地容灾系统和数据仓库系统设计和体系结构
    MySql InnoDB 存储引擎表优化
    Linux之(14)shell(6)gawk进阶
    【分布式系统】docker安装FastDFS分布式文件系统
  • 原文地址:https://blog.csdn.net/qq_60279396/article/details/136466600