初面蚂蚁金服,java商城项目经验简历
線程是否要鎖住同步資源
- 鎖住?悲觀鎖
- 不鎖住?樂觀鎖
鎖住同步資源失敗 線程是否要阻塞
- 阻塞
- 不阻塞自旋鎖,適應性自旋鎖
多個線程競爭同步資源的流程細節有沒有區別
- 不鎖住資源,多個線程只有一個能修改資源成功,其它線程會重試無鎖
- 同一個線程執行同步資源時自動獲取資源偏向鎖
- 多個線程競爭同步資源時,沒有獲取資源的線程自旋等待鎖釋放?輕量級鎖
- 多個線程競爭同步資源時,沒有獲取資源的線程阻塞等待喚醒?重量級鎖
4.多個線程競爭鎖時是否要排隊
- 排隊公平鎖
- 先嘗試插隊,插隊失敗在排隊非公平鎖
一個線程的多個流程能不能獲取同一把鎖
- 能?可重入鎖
- 不能非可重入鎖
多個線程能不能共享一把鎖
- 能?共享
- 不能排他鎖
悲觀鎖與樂觀鎖
悲觀鎖與樂觀鎖時一種廣義的概念,體現的是看待線程同步的不同角度。
悲觀鎖
悲觀鎖認為自己在使用數據的時候一定有別的線程來修改數據,在獲取數據的時候會先加鎖,確保數據不會被別的線程修改。 鎖實現:synchronized?接口Lock的實現類 適用場景:寫操作多,先加鎖可以保證寫操作時數據正確。
樂觀鎖
樂觀鎖認為自己在使用數據時不會有別的線程修改數據,所以不會添加鎖,只是在更新數據的時候去判斷之前有沒有別的線程更新了這個數據。 鎖實現:CAS算法,例如AtomicInteger類的原子自增時通過CAS自旋實現。 適用場景:讀操作較多,不加鎖的特點能夠使其讀操作的性能大幅度提升。 樂觀鎖的執行流程: 線程A獲取到數據以后直接操作,操作完數據以后準備更新同步資源,更新之前會先判斷內存中同步資源是否被更新: 1.如果沒有被更新,更新內存中同步資源的值。 2.如果同步資源被其他線程更新,根據實現方法執行不同的操做(報錯or重試)。
CAS算法
全名:Compare And Swap(比較并交換) 無鎖算法:基于硬件原語實現,在不使用鎖(沒有線程被阻塞)的情況下實現多線程之間的變量同步。 jdk中的實現:java.util.concurrent包中的原子類就是通過CAS來實現了樂觀鎖。 算法涉及到的三個操作數:
需要讀寫的內存值V 進行比較的值A 要寫入的新值的BCAS存在的問題
1.ABA問題 線程1準備用CAS將變量的值由A替換為B,在此之前,線程2將變量的值由A替換為C,又由C替換為A,然后線程1執行CAS時發現變量的值仍然為A,所以CAS成功。但實際上這時的現場已經和最初不同了,盡管CAS成功,但可能存在潛藏的問題。 舉例:一個小偷,把別人家的錢偷了之后又還了回來,還是原來的錢嗎,你老婆出軌之后又回來,還是原來的老婆嗎?ABA問題也一樣,如果不好好解決就會帶來大量的問題。最常見的就是資金問題,也就是別人如果挪用了你的錢,在你發現之前又還了回來。但是別人卻已經觸犯了法律。 但是jdk已經解決了這個問題。 想追下源碼來著,但是一追發現直接到c了。
2.循環時間長開銷大 3.只能保證一個共享變量的原子操作
最后總結
ActiveMQ+Kafka+RabbitMQ學習筆記PDF
-
RabbitMQ實戰指南
-
手寫RocketMQ筆記
-
手寫“Kafka筆記”
關于分布式,限流+緩存+緩存,這三大技術(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。這些相關的面試也好,還有手寫以及學習的筆記PDF,都是啃透分布式技術必不可少的寶藏。以上的每一個專題每一個小分類都有相關的介紹,并且小編也已經將其整理成PDF啦
tMQ)等等。這些相關的面試也好,還有手寫以及學習的筆記PDF,都是啃透分布式技術必不可少的寶藏。以上的每一個專題每一個小分類都有相關的介紹,并且小編也已經將其整理成PDF啦
資料領取方式:戳這里免費領取
總結
以上是生活随笔為你收集整理的初面蚂蚁金服,java商城项目经验简历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最浅显的IE反劫持攻略(转)
- 下一篇: 什么是GreenSock动画平台?