2. 原子性今天這篇文章要詳細(xì)的說說,什么叫原子性,以及如果不是原子性的話,怎么能保證原子性。
創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司,提供網(wǎng)站建設(shè)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
2.1 實(shí)例講述
- 先說下并發(fā)編程的三大特性:
可見性,有序性,原子性。 無論是在什么語言,原子性都是非常重要的,既然是這么晦澀的概念,那什么是原子性呢???- 先來講述下概念:
一組動(dòng)作,要么都成功,要么都失敗,其目的是為了保證數(shù)據(jù)的一致性。 這個(gè)怎么理解呢??? 比如:銀行要將用戶A的錢轉(zhuǎn)給用戶B. 如果A的錢扣除成功了,但是用戶B的錢轉(zhuǎn)賬失敗了,會(huì)怎么辦呢,是不是數(shù)據(jù)跟我們預(yù)想的就不一致了. 如果還是不能理解的話,可以想想Java開發(fā)時(shí)的Mysql事務(wù),其實(shí)也是一個(gè)道理。
private static int count = 0;
private static Object o = new Object();
public static void test01() throws InterruptedException {int MAX_COUNT = 100;
Thread[] threads = new Thread[MAX_COUNT];
CountDownLatch countDownLatch = new CountDownLatch(MAX_COUNT);
for (int i = 0; i< MAX_COUNT; i++) {threads[i] = new Thread(() ->{// synchronized (o) {for (int j = 0; j< 100; j++) {count ++;
}
countDownLatch.countDown();
// }
});
}
for (Thread thread : threads) {thread.start();
}
countDownLatch.await();
System.out.println(count);
}大家可以看看上面的實(shí)例,結(jié)果是不是每次都是10000. 其實(shí)結(jié)果不是的,為什么會(huì)出現(xiàn)這種情況呢???
其實(shí)是并發(fā)線程導(dǎo)致的,大家可以看看上述計(jì)數(shù)的位置n ++. 千萬不要以Java的角度來看代碼,因?yàn)镴ava的代碼計(jì)算機(jī)不識(shí)別的。 看如下圖:

簡(jiǎn)簡(jiǎn)單單的一句話i ++被翻譯為匯編語言后,就這么多句話。而運(yùn)算語句i ++. 可以簡(jiǎn)簡(jiǎn)單單分為三句話取值 =>運(yùn)算 =>設(shè)置值。
既然是分為多行語句,所以運(yùn)行到任何一句語句中都可能被別的線程截?cái)嗟摹?/p>
換言之,整個(gè)i ++是不能作為一個(gè)整體而運(yùn)行的。這就是不能保證所謂的原子性。
那我們最終的目的就很簡(jiǎn)單了,就是保證執(zhí)行過程的原子性,如何保證原子性呢??? 對(duì)了,上鎖
大家還是看不懂上述的實(shí)例的話,給大家看下加鎖以及不加鎖的編譯字節(jié)碼
public class T01_Thread_Test01 {static int i = 0;
public static void main(String[] args) {i ++;
}
}
public class T01_Thread_Test01 {static int i = 0;
public static void main(String[] args) {synchronized (T01_Thread_Test01.class) {i ++;
}
}
}
2.2 鎖的本質(zhì)其實(shí)通過上述的實(shí)例就會(huì)發(fā)現(xiàn),中間部分多了
monitorenter。其實(shí)就是用來加鎖的。加鎖的目的就是為了多線程的序列化
這里先揭曉答案:鎖的本質(zhì)是:
并發(fā)編程的序列化。 那什么叫并發(fā)編程的。其實(shí)大家可以理解為100+人同時(shí)上廁所,這樣大家都很快能解決完,但是估計(jì)會(huì)很擠,而且從道德上而言就不允許這樣。
那我們?cè)趺崔k呢??? 就是通過維持秩序來一個(gè)一個(gè)上廁所。這樣其實(shí)也是可以都上廁所的,但是就是整個(gè)過程會(huì)變慢了。
其實(shí)這就是鎖的本質(zhì)。

3.1 悲觀鎖
多線程訪問數(shù)據(jù) ==>競(jìng)爭(zhēng)條件 ==>導(dǎo)致數(shù)據(jù)不一致, 怎么辦呢??? ==>線程同步(將線程的執(zhí)行順序安排好) ==>加鎖
3.2 樂觀鎖
- 悲觀的認(rèn)為:一個(gè)操作的執(zhí)行一定會(huì)被別的線程打斷的,所以一般我們的上鎖 都是悲觀鎖。
一言不合就上鎖- 直接上鎖,并發(fā)線程對(duì)于同一把鎖 保持同步
3.3 JVM中兩種鎖
- 樂觀的認(rèn)為:某一個(gè)操作是不會(huì)被別的線程打斷的。(
樂觀鎖 又稱 是自旋鎖 以及無鎖)- 既然是無鎖是怎么保證執(zhí)行的順序的呢???
添加version+ 每次計(jì)算后對(duì)比version + 如果version不一致的話,重新進(jìn)行計(jì)算
今天的目的是:更多的以具體實(shí)例來詳解說明了
原子性。 同時(shí)也是普及了樂觀鎖以及悲觀鎖的概念。如果大家覺得有什么不足的地方,歡迎評(píng)論區(qū)及時(shí)留言交流啊
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
名稱欄目:原子性以及悲觀鎖,樂觀鎖-創(chuàng)新互聯(lián)
本文URL:http://www.chinadenli.net/article2/djoeoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站制作、企業(yè)網(wǎng)站制作、網(wǎng)站營(yíng)銷、網(wǎng)站策劃、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容