java map集合 事务控制_对象回收过程?线程池执行过程? map原理?集合类关系?synchronized 和 volatile ? 同一个类的方法事务传播控制还有作用吗?java 锁...
发布日期:2021-06-24 11:44:29 浏览次数:2 分类:技术文章

本文共 980 字,大约阅读时间需要 3 分钟。

1.  对象回收过程?

可达性分析算法: 如果一个对象从 GC Roots 不可达时,则证明此对象不可用。 通过一系列称为GC ROOTS的对象作为起点,从这些起点往下搜索,搜索走过的路径

称为引用链,当一个对象到GC ROOTS 没有任何引用链,我们判定这个对象是可回收的。。

在java 中,可作用GC ROOTS对象的包括:

虚拟机栈(栈针中本地变量表)中引用的对象,

方法区中类静态属性引用的对象,

方法区中常量引用的对象,

本地方法栈中即native 引用的对象。。

具体过程:  在对象不可达时,也并不是非死不可,要真正宣告一个对象死亡,需要进行两次标记过程: 如果一个对象在进行可达性分析后没有与GC ROOTS 的相连接的

引用链,那将会被第一次标记并进行一次筛选: 筛选的目的是判定是否执行finalize方法,当对象没有覆盖finalize 方法,或者finalize 方法已经被虚拟机

调用过,虚拟机认定这两种情况为不必要执行finalize方法。

如果需要执行finalize方法,那么这个对象将会放置在一个F-Queue 队列中,并在稍后建立一个低优先级的线程来执行它。 finalize 方法是对象逃离死亡的

最后机会,在执行finalize 方法时会对F-Queue中的对象进行第二次标记,如果对象在finalize 方法中成功拯救自己(如把this赋值给某个变量,总之就是让

对象出现引用链),则讲该对象移出队列。剩下的对象就只能等待被回收了。

5.  synchronized 和 volatile

volatile 修饰的变量对所有线程具有可见性 , 意思是如果一个线程修改了 该变量,另一个线程可以立即获得修改后的新值。但是这个并不是原子性的,在并发

情况下并不是安全的:原因是多个线程在做运算前获取的可能是脏数据,如何 变量++ 操作,先获取变量值,然后+1, 多个线程获取的是脏数据。

volatile 禁止指令重排序优化:指令重排是指java 编译成机器码时会优化语句执行顺序。 如线程A在执行某些操作后把某个变量赋值true, 另一个线程判断true 做一些操作,

指令重排后可能到指线程A 在某些操作 完成之前就把 变量赋值true了。。导致线程B判断true后并不能获取正确的结果(比如我要获取线程A的某些操作结果)

转载地址:https://blog.csdn.net/weixin_32569115/article/details/114860095 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java sql写入的步骤_步骤 3:使用 Java 连接到 SQL - SQL Server | Microsoft Docs
下一篇:java容器编程题_Java编程练习题(五)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月22日 01时30分25秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章