java map集合 事务控制_对象回收过程?线程池执行过程? map原理?集合类关系?synchronized 和 volatile ? 同一个类的方法事务传播控制还有作用吗?java 锁...
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的某些操作結果)
總結
以上是生活随笔為你收集整理的java map集合 事务控制_对象回收过程?线程池执行过程? map原理?集合类关系?synchronized 和 volatile ? 同一个类的方法事务传播控制还有作用吗?java 锁...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用JWT实现单点登录(完全跨域方案)
- 下一篇: PostgreSQ 存储过程 和 存储函