亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java Synchronized 內存可見性問題

java Synchronized 內存可見性問題

蠱毒傳說 2018-07-15 11:16:14
java中的Synchronized有2個作用1. 互斥訪問2. 保證內存可見性關于第二點,總是有點疑惑,看了很多資料,一般這么描述,1. 在同一個鎖上修改,讀取共享變量,讀線程總是可以獲取最新變量值。2. 后面又有 這樣的描述: 線程釋放鎖時會將強制刷新工作內存中的臟數據到主內存中,獲取一個鎖將強制線程裝載(或重新裝載)字段的值.這里有個鏈接 http://ifeve.com/syn-jmm-visibility/這樣我也有點困惑,以前沒仔細想清楚,特地寫了以下代碼,希望高手可以解惑。假設有3個線程,線程1先調用set方法,然后線程2調用get方法,線程3調用get2方法則可以肯定線程2可以看到線程1修改的num值,線程3是否肯定可以看到最新值呢?
查看完整描述

2 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

線程3可以看到最新值,java會對鎖住的對象判斷是否處于競爭中,如果沒有被競爭,那么會立即執行。如果三個線程是并發執行,那種情況就不確定了,線程2都不一定是最新值,因為有可能線程1還未執行。

如果線程1先執行,那么lock1就已經被釋放了,那么此時lock1和lock2就都是處于未被鎖住的情況,即不存在鎖競爭關系,線程2 、3同時執行必然能取到最新值,不然java的多線程會出現不可預估的數據錯誤,后果很嚴重。

鎖的意義是防止線程競爭造成共享數據混亂,有競爭就會讓線程排隊等候,其實就是把同時執行的情況改造成類似同步的順序執行,Synchronized這個詞的意思就是“同步”,其本質就是讓線程的異步變為同步


查看完整回答
反對 回復 2018-07-15
?
SMILET

TA貢獻1796條經驗 獲得超4個贊

描述里只是說明synchronized開始時刷新一次和退出時提交一次,但并不表示代碼塊在執行的過程中,不會提交或刷新共享變量,所以情況分很多種,糾結這種問題沒什么意義.

你可以在set()方法里寫一個循環對num進行累加,在get2()里多次獲取,看看鎖未釋放時,num是不是不變的.


查看完整回答
反對 回復 2018-07-15
  • 2 回答
  • 0 關注
  • 718 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號