java map集合 事务控制_对象回收过程?线程池执行过程? map原理?集合类关系?synchronized 和 volatile ? 同一个类的方法事务传播控制还有作用吗?java 锁...
1. ?對(duì)象回收過(guò)程?
可達(dá)性分析算法: 如果一個(gè)對(duì)象從 GC Roots 不可達(dá)時(shí),則證明此對(duì)象不可用。 通過(guò)一系列稱(chēng)為GC ROOTS的對(duì)象作為起點(diǎn),從這些起點(diǎn)往下搜索,搜索走過(guò)的路徑
稱(chēng)為引用鏈,當(dāng)一個(gè)對(duì)象到GC ROOTS 沒(méi)有任何引用鏈,我們判定這個(gè)對(duì)象是可回收的。。
在java 中,可作用GC ROOTS對(duì)象的包括:
虛擬機(jī)棧(棧針中本地變量表)中引用的對(duì)象,
方法區(qū)中類(lèi)靜態(tài)屬性引用的對(duì)象,
方法區(qū)中常量引用的對(duì)象,
本地方法棧中即native 引用的對(duì)象。。
具體過(guò)程: ?在對(duì)象不可達(dá)時(shí),也并不是非死不可,要真正宣告一個(gè)對(duì)象死亡,需要進(jìn)行兩次標(biāo)記過(guò)程: 如果一個(gè)對(duì)象在進(jìn)行可達(dá)性分析后沒(méi)有與GC ROOTS 的相連接的
引用鏈,那將會(huì)被第一次標(biāo)記并進(jìn)行一次篩選: 篩選的目的是判定是否執(zhí)行finalize方法,當(dāng)對(duì)象沒(méi)有覆蓋finalize 方法,或者finalize 方法已經(jīng)被虛擬機(jī)
調(diào)用過(guò),虛擬機(jī)認(rèn)定這兩種情況為不必要執(zhí)行finalize方法。
如果需要執(zhí)行finalize方法,那么這個(gè)對(duì)象將會(huì)放置在一個(gè)F-Queue 隊(duì)列中,并在稍后建立一個(gè)低優(yōu)先級(jí)的線程來(lái)執(zhí)行它。 finalize 方法是對(duì)象逃離死亡的
最后機(jī)會(huì),在執(zhí)行finalize 方法時(shí)會(huì)對(duì)F-Queue中的對(duì)象進(jìn)行第二次標(biāo)記,如果對(duì)象在finalize 方法中成功拯救自己(如把this賦值給某個(gè)變量,總之就是讓
對(duì)象出現(xiàn)引用鏈),則講該對(duì)象移出隊(duì)列。剩下的對(duì)象就只能等待被回收了。
5. ?synchronized 和 volatile
volatile 修飾的變量對(duì)所有線程具有可見(jiàn)性 , 意思是如果一個(gè)線程修改了 該變量,另一個(gè)線程可以立即獲得修改后的新值。但是這個(gè)并不是原子性的,在并發(fā)
情況下并不是安全的:原因是多個(gè)線程在做運(yùn)算前獲取的可能是臟數(shù)據(jù),如何 變量++ 操作,先獲取變量值,然后+1, 多個(gè)線程獲取的是臟數(shù)據(jù)。
volatile 禁止指令重排序優(yōu)化:指令重排是指java 編譯成機(jī)器碼時(shí)會(huì)優(yōu)化語(yǔ)句執(zhí)行順序。 如線程A在執(zhí)行某些操作后把某個(gè)變量賦值true, 另一個(gè)線程判斷true 做一些操作,
指令重排后可能到指線程A 在某些操作 完成之前就把 變量賦值true了。。導(dǎo)致線程B判斷true后并不能獲取正確的結(jié)果(比如我要獲取線程A的某些操作結(jié)果)
總結(jié)
以上是生活随笔為你收集整理的java map集合 事务控制_对象回收过程?线程池执行过程? map原理?集合类关系?synchronized 和 volatile ? 同一个类的方法事务传播控制还有作用吗?java 锁...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用JWT实现单点登录(完全跨域方案)
- 下一篇: PostgreSQ 存储过程 和 存储函