国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

理解Java中的Volatile關鍵字(demo)

codecraft / 2014人閱讀

摘要:現在的處理器,一般是會有多個的,每個線程可能運行在不同的,那么線程修改完成的值,是首先保存在中去。考慮這樣一種情況現在有兩個線程,線程和線程,他們不時會去讀取這個共享變量。

什么是volatile

關鍵字volatile 提供了Java 虛擬機中最輕量級的同步機制。在meidium 中有篇文章說:Volatile?specifier?is used to indicate that a?variable’s value can be modified by multiple?threads?simultaneously

當你使用了volatile之后,那么這個變量會有如下的特性:

保證此變量對所有的線程的可見性

禁止指令重排序優化

對于第一條的內容,volatile是如何保證讀寫操作對所有的線程可見?

這里涉及到可見性的問題。

對于普通的變量來說,每個線程要想修改變量的值,首先從主存(JMM的定義,在JVM中,大致是可以對應到堆內存的)中拷貝值到自己所屬的CPU cache中去。現在的處理器,一般是會有多個CPU的,每個線程可能運行在不同的CPU, 那么線程修改完成的值,是首先保存在CPU cache中去。此時其他的線程是察覺不到修改的結果的,這就造成了并發模型中的可見性問題。

考慮這樣一種情況:

public class SharedObject { 
   public int counter = 0;
}

現在有兩個線程, 線程1和線程2, 他們不時會去讀取這個共享變量。如果counter沒有聲明volatile這個關鍵字,那么此時就無法保證counter的值何時從CPU緩存寫回到主存。這意味著,counter在CPU cache中的值和主存中的會不一致。

但是如果聲明了volatile的話,對volatile變量進行寫操作的話,那么JVM就會向處理器發送一條LOCK前綴的指令,將這個變量所在緩存行中的數據寫回到系統內存。

寫回的過程,為了保證各個處理器的緩存是一一致的,就會實現緩存一致性協議。

緩存不停地窺探總線上發生的數據交換,來檢查自己的數據是不是已經過期了。如果發現此時緩存行中的值已經失效的話,就會將當前緩存行中的值設置為無效狀態。處理器要用到這個值的話,就會從內存中重新獲取這個值。

禁止指令重排序

指令重排序是指CPU采用了允許將多條指令不按照程序規定的順序分開發送給各相應的電路單元處理

TODO --

參考:

https://blog.usejournal.com/j...

https://medium.com/@siddhusin...

https://www.cnblogs.com/dolph...

《Java特種兵》

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75209.html

相關文章

  • 《深入理解 Java 內存模型》讀書筆記

    摘要:前提深入理解內存模型程曉明著,該書在以前看過一遍,現在學的東西越多,感覺那塊越重要,于是又再細看一遍,于是便有了下面的讀書筆記總結。同步同步是指程序用于控制不同線程之間操作發生相對順序的機制。線程之間的通信由內存模型控制。 showImg(https://segmentfault.com/img/remote/1460000013474312?w=1920&h=1271); 前提 《深...

    xuexiangjys 評論0 收藏0
  • 《深入理解 Java 內存模型》讀書筆記

    摘要:前提深入理解內存模型程曉明著,該書在以前看過一遍,現在學的東西越多,感覺那塊越重要,于是又再細看一遍,于是便有了下面的讀書筆記總結。同步同步是指程序用于控制不同線程之間操作發生相對順序的機制。線程之間的通信由內存模型控制。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6RtPu3BNx3zps1JhSmPICRw7QgeOmxOfTb...

    姘存按 評論0 收藏0
  • 【J2SE】java并發基礎

    摘要:的線程機制是搶占式。會讓出當多個線程并發的對主存中的數據進行操作時,有且只有一個會成功,其余均失敗。和對象只有在困難的多線程問題中才是必須的。 并發簡述 并發通常是用于提高運行在單處理器上的程序的性能。在單 CPU 機器上使用多任務的程序在任意時刻只在執行一項工作。 并發編程使得一個程序可以被劃分為多個分離的、獨立的任務。一個線程就是在進程中的一個單一的順序控制流。java的線程機制是...

    tianyu 評論0 收藏0
  • java 鍵字總結

    摘要:關鍵字總結有個關鍵字,它們是接下來對其中常用的幾個關鍵字進行概括。而通過關鍵字,并不能解決非原子操作的線程安全性。為了在一個特定對象的一個域上關閉,可以在這個域前加上關鍵字。是語言的關鍵字,用來表示一個域不是該對象串行化的一部分。 java 關鍵字總結 Java有50個關鍵字,它們是: abstract do implements private ...

    honmaple 評論0 收藏0
  • 理解java Volatile 鍵字

    摘要:最近在看多線程相關,看到這篇來自大神關于關鍵字的講解感覺非常詳細易懂,特此轉載一下。如果對增加聲明則所有線程對的寫都會立即刷新到主存中,而且所有對的讀也都直接從主存中去讀。 最近在看java多線程相關,看到這篇來自大神Jakob Jenkov關于Volatile關鍵字的講解感覺非常詳細易懂,特此轉載一下。原文鏈接:http://tutorials.jenkov.com/j... 內存可...

    ConardLi 評論0 收藏0

發表評論

0條評論

codecraft

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<