五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java多線程并發(fā)鎖和原子操作,你了解多少

2018-10-16 09:58 作者:動力節(jié)點  | 我要投稿

  對于Java多線程,接觸最多的莫過于使用synchronized,這個簡單易懂,但是這synchronized并非性能最優(yōu)的。今天我就簡單介紹一下幾種鎖。可能我下面講的時候其實很多東西不會特別深刻,最好的方式是自己做實驗,把各種場景在代碼中實驗一下,這樣發(fā)發(fā)現(xiàn)很多細(xì)節(jié)。


  Volatile


  作為Java中的輕量級鎖,當(dāng)多線程中一個線程操作后可以保證其他線程可見,也就是書上所說的“可見性”,另外一個就是“重排序”。所謂重排序指的是JVM對指令的優(yōu)化。很多人可能在實際實驗中發(fā)現(xiàn)好像不是如此,最后的例子我也會說明這一點。


  synchronized


  這個作為Java中“重量級”的線程安全機(jī)制被大家所熟知,這個就不在這里做解釋了。


  java.util.concurrent.locks.ReentrantLock


  java.util.concurrent.中是JDK1.5中出的對于一些并發(fā)操作的類庫,其中包括很多同學(xué)很喜歡的原子類,比如說AtomicInteger。它里面原理就是一個CAS,這里就不做過多的闡述,有興趣的可以看看源碼。


  好,說一下ReentrantLock,這個鎖主要是能顯示的添加鎖和釋放鎖,好處是更加靈活,能夠更加準(zhǔn)確的控制鎖,也能確保系統(tǒng)的穩(wěn)定,比如說“重連”。后面代碼會有使用到。


  實際場景


  上面介紹完了幾種鎖,下面用具體的代碼來看看幾種鎖的實際用法,以及各種表現(xiàn)形式。代碼有點長,這里最好自己實驗一下,然后看看結(jié)果,并思考這個結(jié)果。


  輸出結(jié)果:


  i>>>>>381890


  vi>>>>>353610


  ai>>>>>400000


  si>>>>>392718


  ri>>>>>392658


  從上面的輸出結(jié)果來看真是讓人大感意外:只有原子操作AtomicInteger的結(jié)果保證了多線程的安全性,而其他不管是用輕量級的volatile還是重量級的synchronized都沒有達(dá)到我們想要的效果。這也讓我產(chǎn)生了大在的懷疑。難道問題真的這么蹊蹺?


  從這里不難看出除了AtomicInteger用的是其自己的方法而其他都是用到了Java的語法糖++操作。而這讓我想起了++操作并非原子操作,而可能在其中間操作導(dǎo)致了其他線程對其他進(jìn)行了修改,雖然同樣的問題我在《ThinkinJava》中也找到可以佐證的例子。這里有一個問題就是synchronized:因為我對si已經(jīng)加了synchronized操作,但是輸出的結(jié)果令人意外,難道還會有問題?這讓我想把這段代碼編譯成字節(jié)碼的沖動。好吧,下面看字節(jié)碼(這里我單獨把synchronized這一段操作抽出來,作為分析,其他幾個就算了,不然編譯后的字節(jié)碼有點多)


  為了方便看,先貼出源代碼


  下面是字節(jié)碼,為了節(jié)省篇幅,一些不重要的部分我將不貼出


  從這里一看從monitorenter進(jìn)入安全區(qū)到monitorexit出安全區(qū)沒有發(fā)現(xiàn)si是處于中間狀態(tài)的,那又是在哪出的問題呢?這里簡單說一下,歸根結(jié)底仍然是(++)操作非原子操作,可是很多人疑惑了,這里不是加鎖了嗎?廢話不多說,在我的深入探析Java線程鎖機(jī)制有一個比較詳細(xì)的分析。


  


Java多線程并發(fā)鎖和原子操作,你了解多少的評論 (共 條)

分享到微博請遵守國家法律
甘南县| 伊宁市| 枞阳县| 蚌埠市| 天等县| 枝江市| 光泽县| 安仁县| 榆林市| 定日县| 泊头市| 射洪县| 沽源县| 麟游县| 甘南县| 桐梓县| 鄂尔多斯市| 沅陵县| 齐齐哈尔市| 平利县| 伊通| 合肥市| 高陵县| 清新县| 绥江县| 濮阳县| 平利县| 临汾市| 沙雅县| 武邑县| 类乌齐县| 武安市| 黎平县| 开平市| 博湖县| 衡山县| 集贤县| 兴仁县| 德清县| 天门市| 新和县|