posts - 110, comments - 101, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          volatile 與 synchronized 區(qū)別

          Posted on 2012-12-01 21:19 云云 閱讀(13714) 評論(0)  編輯  收藏

          在Java中,為了保證多線程讀寫數(shù)據(jù)時保證數(shù)據(jù)的一致性,可以采用兩種方式:

          同步

          如用synchronized關(guān)鍵字,或者使用鎖對象.

          volatile

          使用volatile關(guān)鍵字
          用一句話概括volatile,它能夠使變量在值發(fā)生改變時能盡快地讓其他線程知道.

          volatile詳解

          首先我們要先意識到有這樣的現(xiàn)象,編譯器為了加快程序運行的速度,對一些變量的寫操作會先在寄存器或者是CPU緩存上進(jìn)行,最后才寫入內(nèi)存.
          而在這個過程,變量的新值對其他線程是不可見的.而volatile的作用就是使它修飾的變量的讀寫操作都必須在內(nèi)存中進(jìn)行!

          volatile與synchronized

            volatile本質(zhì)是在告訴jvm當(dāng)前變量在寄存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當(dāng)前變量,只有當(dāng)前線程可以訪問該變量,其他線程被阻塞住.
            volatile僅能使用在變量級別,synchronized則可以使用在變量,方法.
            volatile僅能實現(xiàn)變量的修改可見性,但不具備原子特性,而synchronized則可以保證變量的修改可見性和原子性.
            volatile不會造成線程的阻塞,而synchronized可能會造成線程的阻塞.
            volatile標(biāo)記的變量不會被編譯器優(yōu)化,而synchronized標(biāo)記的變量可以被編譯器優(yōu)化.

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 柳河县| 高青县| 汉寿县| 保靖县| 全州县| 白城市| 杨浦区| 雅安市| 蓝田县| 黑龙江省| 耒阳市| 刚察县| 新源县| 依安县| 蒙城县| 柏乡县| 噶尔县| 屯昌县| 息烽县| 东乡县| 图们市| 天祝| 仁怀市| 文水县| 同心县| 上犹县| 泾阳县| 都昌县| 阳原县| 陆丰市| 长武县| 手游| 无为县| 吉隆县| 和顺县| 浮梁县| 永兴县| 元阳县| 侯马市| 长宁县| 子洲县|