volatile的應用

volatile,中文意思是不穩定的、反復無常的,用來修飾變量,和多線程、并發有關系。

Java代碼在編譯后會變成Java字節碼,字節碼被類加載器加載到JVM里,JVM執行字節碼,最終需要轉化為匯編指令在CPU上執行。

在多線程并發編程中 synchronized 和 volatile 都扮演著重要的角色。volatile 是輕量級的 synchronized,它在多處理器開發中保證了共享變量的“可見性”。可見性的意思是當一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。如果 volatile 使用恰當的話,它比 synchronized 的使用和執行成本更低,因為它不會引起線程上下文的切換和調度。

volatile 是如何來保證可見性的呢?對 volatile 修飾的共享變量進行寫操作時,觀察其匯編指令可發現有一條Lock前綴的指令。這個指令在多核處理器下會引發兩件事情:

1)將當前處理器緩存行的數據寫回到系統內存。

2)這個寫回內存的操作會導致其他處理器的緩存無效。

為了提高處理速度,處理器不直接和內存進行通信,而是先將系統內存的數據讀到內部緩存(L1,L2,L3)后再進行操作,但操作完之后不知道何時會寫到內存。如果對 volatile 修飾的變量進行寫操作,JVM就會向處理器發送一條Lock前綴的指令,將這個變量所在緩存行的數據寫回到系統內存。但是,這個時候其他處理器緩存的值還是舊值,再執行計算操作就會有問題。所以,在多核處理器下,為了保證各個處理器的緩存一致,就會實現緩存一致性協議(MESI協議),每個處理器通過嗅探在總線上傳播的數據來檢查自己緩存的值是不是過期了,當處理器發現自己緩存行對應的內存地址被修改,就會將當前處理器緩存行設置為無效狀態,當處理器對這個數據進行寫操作時,會重新從系統內存中把數據讀到處理器緩存中。

轉載于:https://www.cnblogs.com/koushr/p/9302330.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451218.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451218.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

漫談國內智能手機市場現狀

本文純屬一時興起,想到哪兒寫到哪兒,本人文筆也不咋地,寫的也比較隨意,如有錯誤歡迎指正,有啥意見歡迎交流。原創文章,轉載注明emouse的技術專欄。 我是一個不折不扣的數碼愛好者,對電腦手機這些…

【刷題】BZOJ 4195 [Noi2015]程序自動分析

Description 在實現程序自動分析的過程中,常常需要判定一些約束條件是否能被同時滿足。 考慮一個約束滿足問題的簡化版本:假設x1,x2,x3,…代表程序中出現的變量,給定n個形如xixj或xi≠xj的變量相等/不等的約束條件,請判定是否可以分別為每一個…

mysql 5.5 安裝配置方法圖文教程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 回憶一下mysql 5.5 安裝配置方法,整理mysql 5.5 安裝配置教程筆記,分享給大家。 MySQL下載地址:htt…

git解除與遠程分支的關聯

在工作中,經常需要將同一份代碼傳到不同的git倉庫中去 如果本地同樣一份代碼,已經關聯了一個與遠程分支,那么怎么才能解除原程分支,并關聯到一個新的分支將代碼提交到新的分支上去呢? 1、如果你已經在遠程創建了一個分…

FindWindow用法

函數功能:該函數獲得一個頂層窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個函數不查找子窗口。在查找時不區分大小寫。 函數型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName&#xff0…

中國大城市政治地位綜合實力排名

中國大城市政治地位綜合實力排名! 中國大城市政治地位綜合實力排名!政治地位: 政治地位: 1(直轄市 4 個):上海、北京、天津、重慶 2(副省級城市 15 個):廣州、深圳、武漢、南京、沈陽…

sourcemap總結

sourcemap在線上壓縮文件調試中很重要,在此總結如下: 1. 開啟sourcemap (1). 瀏覽器要開啟source-map支持(2). 壓縮文件底部要有source-map的URL,壓縮要開啟source-map(3). .map文件要放在服務器,source-map URL指向的位置 2. sou…

navicat 導出的sql文件,再導入,運行SQL文件成功,數據庫中卻沒有表

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 問題描述:本來在數據庫上右鍵 ,運行SQL文件 ,就可以導入 sql ,建表成功,并且數據也該的…

mysql索引之二級索引學習總結

二級索引又稱輔助索引、非聚集索引(no-clustered index)。b&#xff0b;tree樹結構。然而二級索引的葉子節點不保存記錄中的所有列&#xff0c;其葉子節點保存的是<健值&#xff0c;(記錄)地址>。好似聚集索引中非葉子節點保存的信息&#xff0c;不同的是二級索引保存的是…

264,avs中Skip宏塊與Direct預測模式 ,對稱模式的區別

1. B_Skip類型宏塊 &#xff1a;無像素殘差&#xff0c;無運動矢量殘差&#xff08;MVD&#xff09;和參考幀。解碼時&#xff0c;通過Direct預測模式&#xff08;時間或空間&#xff09;計算出前、后向MV后&#xff0c;直接利用前、后向MV得到像素預測值。像 素重構值像…

【hdu 6444】Neko's loop

【鏈接】 我是鏈接,點我呀:) 【題意】 給你一個序列. 你可以選擇起點i。 然后每次往右跳k次。 得到下一個值a[ik];。 問你跳m次能得到的最大值ma是多少。 如果>s輸出0 否則輸出s-ma; 【題解】 最后肯定會形成gcd(n,k)個環的。 對于每個環(長度為cnt。 預處理出從1..2cnt的…

高性能MySQL之Count統計查詢

近一段時間&#xff0c;有同事問我 “MySQL執行count很慢&#xff0c;有沒有什么優化的空間”。當時在忙&#xff0c;就回復了一句“innodb里面count統計都是實時統計&#xff0c;慢一些是正常的”&#xff0c; 周末閑暇下來&#xff0c;想到以前有好多人都問過關于count的問題…

js轉換字符串為base64位

在window對象下有兩個api,可以對ASCII編碼進行編譯,得到base64位的字符串 btoa:編碼為base64atob:解碼為ASCII碼此種方法不能對中文進行操作,因為ASCII碼中沒有中文,如果編碼會得到亂碼 要編碼中文可以先用encodeURIComponent() 對字符串進行轉義,轉義后再btoa()成base64就可以…

java 文件下載,中文表名,中文內容

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 RequestMapping("userDownloadTemplet")private void userDownloadTemplet(HttpServletRequest request,HttpServletResponse …

cherry-pick的用法

簡述 git cherry-pick可以選擇某一個分支中的一個或幾個commit(s)來進行操作。例如&#xff0c;假設我們有個穩定版本的分支&#xff0c;叫v2.0&#xff0c;另外還有個開發版本的分支v3.0&#xff0c;我們不能直接把兩個分支合并&#xff0c;這樣會導致穩定版本混亂&#xff0c…

Docker 二進制安裝docker

https://blog.csdn.net/bruce_yds/article/details/80035714轉載于:https://www.cnblogs.com/Presley-lpc/p/9698724.html

264,avs重要的變量:

B幀&#xff1a; B8pdir[i] i為0,1,2,3&#xff1b;值的含義&#xff1a;0&#xff1a;前向 &#xff1b;1&#xff1a;后向&#xff1b;2&#xff1a;雙向&#xff1b;如果為intra_block,則為-1. B8mode[i] i為0,1,2,3 &#xff0c;值的含義&#xff1a;1:16x16 2:16x8 3…

insert into 語句的三種寫法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 insert into 語句的三種寫法 方式1、 INSERT INTO t1(field1,field2) VALUE(v001,v002); // 明確只插入一條Value 方式2、 IN…

Linux系統中跟TCP相關的內核參數

1. TCP保活機制 參考 《Nginx(三) 配置文件詳解 - 基礎模塊》3.18章節 net.ipv4.tcp_keepalive_intvl&#xff1a;設置兩次相鄰探活檢測的間隔時間。默認是75秒&#xff0c;單位是秒。net.ipv4.tcp_keepalive_probes&#xff1a;設置探活最多檢測次數。默認是9次&#xff0c;單…

ECMAScript3中數組方法

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>ECMAScript3中數組方法</title></head><body><script>//字符串和數組之間相轉換的方法 1.join() split() /*var str abcdefg…