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=>适合锁大量的同步代码块

         

  • 45
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖六儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值