以下內(nèi)容整理自互聯(lián)網(wǎng),僅用于個(gè)人學(xué)習(xí)
transient
作用:加了該關(guān)鍵字的屬性,不會(huì)被序列化。
換句話說(shuō),這個(gè)字段僅存于調(diào)用者內(nèi)存,而不會(huì)寫(xiě)到磁盤(pán)里持久化。
序列化原理:將待序列化的對(duì)象中的信息寫(xiě)入到磁盤(pán)或網(wǎng)絡(luò)流中。序列化中的引用會(huì)進(jìn)行“深度復(fù)制”,并且如果兩個(gè)對(duì)象有共同的引用對(duì)象,且兩個(gè)對(duì)象都寫(xiě)入同一個(gè)流,那么該引用對(duì)象不會(huì)重復(fù)創(chuàng)建,只會(huì)創(chuàng)建一次,并還原到虛擬機(jī)后引用的還是同一個(gè)對(duì)象。但是,如果寫(xiě)入不同的流中,那么兩次創(chuàng)建的是完全不同還原對(duì)象。
volatile
volatile變量是一種稍弱的同步機(jī)制在訪問(wèn)volatile變量時(shí)不會(huì)執(zhí)行加鎖操作,因此也就不會(huì)使執(zhí)行線程阻塞,因此volatile變量是一種比synchronized關(guān)鍵字更輕量級(jí)的同步機(jī)制。
每個(gè)線程訪問(wèn)堆中對(duì)象時(shí),將堆中對(duì)象load到線程本地內(nèi)存中,建立一個(gè)變量副本,之后線程就不再和對(duì)象在堆變量值有任何關(guān)系,而是直接修改副本變量值。
修改完之后,自動(dòng)把線程變量副本的值寫(xiě)到對(duì)象在堆變量中。這樣堆中對(duì)象的值就產(chǎn)生了變化。這些操作不是原子性的。
使用volatile修飾變量,JVM只是保證從內(nèi)存加載到線程工作內(nèi)存中的值是最新的。因此,即使使volatile還是會(huì)存在并發(fā)情況。
當(dāng)且僅當(dāng)滿足以下所有條件時(shí),才應(yīng)該使用volatile變量:
- 對(duì)變量的寫(xiě)入操作不依賴變量的當(dāng)前值,或者你能確保只有單個(gè)線程更新變量的值。
- 該變量沒(méi)有包含在具有其他變量的不變式中。