您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Java高并發(fā)的三種實現(xiàn)案例講解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java高并發(fā)的三種實現(xiàn)案例講解”吧!
提到鎖,大家肯定想到的是sychronized關(guān)鍵字。是用它可以解決一切并發(fā)問題,但是,對于系統(tǒng)吞吐量要求更高的話,我們這提供幾個小技巧。幫助大家減小鎖顆粒度,提高并發(fā)能力。
樂觀鎖使用的場景是,讀不會沖突,寫會沖突。同時讀的頻率遠(yuǎn)大于寫。
悲觀鎖的實現(xiàn):
悲觀的認(rèn)為所有代碼執(zhí)行都會有并發(fā)問題,所以將所有代碼塊都用sychronized鎖住
樂觀鎖的實現(xiàn):
樂觀的認(rèn)為在讀的時候不會產(chǎn)生沖突為題,在寫時添加鎖。所以解決的應(yīng)用場景是讀遠(yuǎn)大于寫時的場景。
樂觀鎖不能很好的解決大量的寫沖突的問題,但是很多場景下,鎖只是針對某個用戶或者某個訂單。 比如一個用戶先創(chuàng)建session,才能進(jìn)行后面的操作,但是由于網(wǎng)絡(luò)的問題,創(chuàng)建session的請求和后續(xù)請求幾乎同時到達(dá),而并行線程可能會先處理后面的請求。一般情況需要對用戶sessionMap加鎖,比如上面的樂觀鎖。在這樣的場景下,可以將鎖限定在用戶本身上,即原來的
這個比較類似行鎖和數(shù)據(jù)庫表鎖的概念。顯然行鎖的并發(fā)能力比表鎖的高很多。
實用String.intern();是這種方式的具體實現(xiàn)。類String維護(hù)了一個字符串池。當(dāng)調(diào)用intern方法時,如果池已經(jīng)包含一個等于此String對象的字符串(該對象由equals(Object)方法確定),則返回池中的字符串。可見,當(dāng)String 相同時,總返回同一個對象,因此就實現(xiàn)了對同一用戶加鎖。由于所的顆粒度局限于具體用戶,使得系統(tǒng)獲得最大程度的并發(fā)。
CopyOnWriteMap?
既然說到了“類似于數(shù)據(jù)庫中的行鎖的概念”,就不得不提一下MVCC,Java中CopyOnWrite類實現(xiàn)了MVCC。Copy On Write是這樣一種機(jī)制。當(dāng)我們讀取共享數(shù)據(jù)的時候,直接讀取,不需要同步。當(dāng)我們修改數(shù)據(jù)的時候,我們就把當(dāng)前數(shù)據(jù)Copy一份副本,然后在這個副本 上進(jìn)行修改,完成之后,再用修改后的副本,替換掉原來的數(shù)據(jù)。這種方法就叫做Copy On Write。
但是,,,JDK并沒有提供CopyOnWriteMap,為什么?下面有個很好的回答,那就是已經(jīng)有了ConcurrentHashMap,為什么還需要CopyOnWriteMap?
String.inter()的缺陷是類 String 維護(hù)一個字符串池是放在JVM perm區(qū)的,如果用戶數(shù)特別多,導(dǎo)致放入字符串池的String不可控,有可能導(dǎo)致OOM錯誤或者過多的Full GC。怎么樣能控制鎖的個數(shù),同時減小粒度鎖呢?直接使用Java ConcurrentHashMap?或者你想加入自己更精細(xì)的控制?那么可以借鑒ConcurrentHashMap的方式,將需要加鎖的對象分為多個bucket,每個bucket加一個鎖,偽代碼如下:
到此,相信大家對“Java高并發(fā)的三種實現(xiàn)案例講解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。