久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

Java并發(fā)面試題實例分析

這篇文章主要講解了“Java并發(fā)面試題實例分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java并發(fā)面試題實例分析”吧!

成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的大廠網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

題目

Java并發(fā)面試題實例分析

結(jié)論

多線程并發(fā)的同時進(jìn)行set、get操作, A線程調(diào)用set方法,B線程并一定能對這個改變可見!??!

分析

這個類非常簡單,里面有一個屬性,有2個方法:get、set方法,一個用來設(shè)置屬性值,一個用來獲取屬性值,在設(shè)置屬性方法上面加了synchronized。

隱式信息:多線程并發(fā)的同時進(jìn)行set、get操作, A線程調(diào)用set方法,B線程可以里面感知到嗎???

說到這里, 問題就變成了synchronized在剛剛說的上下文下面能否保證可見性?。?!

關(guān)鍵詞synchronized的用法

指定加鎖對象:對給定對象加鎖,進(jìn)入同步代碼前需要獲得給定對象的鎖。

直接作用于實例方法:相當(dāng)于對當(dāng)前實例加鎖,進(jìn)入同步代碼前要獲得當(dāng)前實例的鎖。

直接作用于靜態(tài)方法:相當(dāng)于對當(dāng)前類加鎖,進(jìn)入同步代碼前要獲得當(dāng)前類的鎖。

synchronized它的工作就是對需要同步的代碼加鎖,使得每一次只有一個線程可以進(jìn)入同步塊(其實是一種悲觀策略)從而保證線程之間得安全性。

從這里我們可以知道,我們需要分析的屬于第二類情況,也就是說多個線程如果同時進(jìn)行set方法的時候,由于存在鎖,所以會一個一個進(jìn)行set操作,并且是線程安全的,但是get方法并沒有加鎖,表示假如A線程在進(jìn)行set的同時B線程可以進(jìn)行g(shù)et操作。并且可以多個線程同時進(jìn)行g(shù)et操作,但是同一時間最多只能有一個set操作。

Java 內(nèi)存模型 happens-before原則

JSR-133 內(nèi)存模型使用 happens-before 的概念來闡述操作之間的內(nèi)存可見性。在 JMM 中,如果 一個操作執(zhí)行的結(jié)果需要對另一個操作可見 ,那么這兩個操作之間必須要存在 happens-before 關(guān)系。這里提到的兩個操作既可以是在一個線程之內(nèi),也可以是在不同線程之間。

與程序員密切相關(guān)的 happens-before 規(guī)則如下:

程序順序規(guī)則:一個線程中的每個操作,happens-before 于該線程中的任意后續(xù)操作。

監(jiān)視器鎖規(guī)則:對一個監(jiān)視器的解鎖,happens-before 于隨后對這個監(jiān)視器的加鎖。

volatile 變量規(guī)則:對一個 volatile 域的寫,happens-before 于任意后續(xù)對這個 volatile 域的讀。

傳遞性:如果 A happens-before B,且 B happens-before C,那么 A happens-before C。

注意,兩個操作之間具有 happens-before 關(guān)系,并不意味著前一個操作必須要在后一個操作之前執(zhí)行!happens-before 僅僅要求前一個操作(執(zhí)行的結(jié)果)對后一個操作可見,且前一個操作按順序排在第二個操作之前(the first is visible to and ordered before the second)。

其中有 監(jiān)視器鎖規(guī)則:對一個監(jiān)視器的解鎖,happens-before 于隨后對這個監(jiān)視器的加鎖。這一條,僅僅只是針對synchronized的set方法,而對于get并沒有這方面的說明。

其實在這種上下文下面一個synchronized的set方法,一個普通的get方法,a線程調(diào)用set方法,b線程并一定能對這個改變可見!

volatile

volatile可見性

前面happens-before原則就提到: volatile 變量規(guī)則:對一個 volatile 域的寫,happens-before 于任意后續(xù)對這個 volatile 域的讀。 volatile從而保證了多線程下的可見性?。。?/p>

volatile 禁止內(nèi)存重排序

下面是 JMM 針對編譯器制定的 volatile 重排序規(guī)則表:

Java并發(fā)面試題實例分析

為了實現(xiàn) volatile 的內(nèi)存語義,編譯器在生成字節(jié)碼時,會在指令序列中插入內(nèi)存屏障來禁止特定類型的處理器重排序。

下面是基于保守策略的 JMM 內(nèi)存屏障插入策略:

在每個 volatile 寫操作的前面插入一個 StoreStore 屏障。

在每個 volatile 寫操作的后面插入一個 StoreLoad 屏障。

在每個 volatile 讀操作的后面插入一個 LoadLoad 屏障。

在每個 volatile 讀操作的后面插入一個 LoadStore 屏障。

下面是保守策略下,volatile 寫操作 插入內(nèi)存屏障后生成的指令序列示意圖:

Java并發(fā)面試題實例分析

下面是在保守策略下,volatile 讀操作 插入內(nèi)存屏障后生成的指令序列示意圖:

Java并發(fā)面試題實例分析

上述 volatile 寫操作和 volatile 讀操作的內(nèi)存屏障插入策略非常保守。在實際執(zhí)行時,只要不改變 volatile 寫-讀的內(nèi)存語義,編譯器可以根據(jù)具體情況省略不必要的屏障。

模擬

通過上面的分析,其實這個題目涉及到的內(nèi)容都提到了,并且進(jìn)行了解答。

雖然你知道的原因,但是想模擬并不是一件容易的事情!,下面我們來模擬看看效果:

publicclassThreadSafeCache{intresult;publicintgetResult(){returnresult;    }publicsynchronizedvoidsetResult(intresult){this.result = result;    }publicstaticvoidmain(String[] args){        ThreadSafeCache threadSafeCache =newThreadSafeCache();for(inti =0; i <8; i++) {newThread(() -> {intx =0;while(threadSafeCache.getResult() <100) {                    x++;                }                System.out.println(x);            }).start();        }try{            Thread.sleep(1000);        }catch(InterruptedException e) {            e.printStackTrace();        }        threadSafeCache.setResult(200);    }}

效果:

Java并發(fā)面試題實例分析

程序會一直卡在這邊不動,表示set修改的200,get方法并不可見?。?!

添加volatile 關(guān)鍵詞觀察效果

其實例子中synchronized關(guān)鍵字可以去掉,僅僅用volatile即可。

Java并發(fā)面試題實例分析

效果:

Java并發(fā)面試題實例分析

代碼很快正常結(jié)束了!

感謝各位的閱讀,以上就是“Java并發(fā)面試題實例分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java并發(fā)面試題實例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

分享文章:Java并發(fā)面試題實例分析
路徑分享:http://www.sd-ha.com/article42/josshc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管網(wǎng)站改版、App開發(fā)網(wǎng)站策劃、用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司