關(guān)鍵字transient、volatile

以下內(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)有包含在具有其他變量的不變式中。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,802評(píng)論 11 349
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,896評(píng)論 0 11
  • 今天要穿25的褲子了,希望不會(huì)丟臉。
    茄子就是茄子閱讀 69評(píng)論 0 0
  • 心在哪,收獲就在哪 黃傳修 今天繼續(xù)到雙月湖晨練,自從搬家到這里,這個(gè)習(xí)慣已經(jīng)十幾年了。有人說(shuō):“那些鍛煉的人都是...
    黃傳修閱讀 822評(píng)論 4 1
  • 長(zhǎng)。 志昂。 小碧墻。 語(yǔ)露向往。 競(jìng)渡仕氣場(chǎng)。 江山煙樹(shù)癡狂。 孰復(fù)如話鳳求凰? 弦管笙琶吹徹曉。 流年煙波浩渺...
    錦兮公子閱讀 263評(píng)論 0 1

友情鏈接更多精彩內(nèi)容