開篇介紹面試
你們好,公衆號【Java極客思惟】近期會整理一些Java高頻面試題分享給小夥伴,也但願看到的小夥伴在找工做過程當中可以用獲得!本章節主要針對Java一些多線程高頻面試題進行分享。微信
Q1:多線程
樂觀鎖 和 悲觀鎖併發
樂觀鎖:性能
樂觀鎖(Optimistic Locking)實際上是一種思想。相對悲觀鎖而言,樂觀鎖假設認爲數據通常狀況下不會形成衝突,所在數據進行提交更新的時候,纔會正式對數據的衝突與否進行檢測,若是發現衝突了,則讓返回用戶錯誤的信息,讓用戶決定如何去作。this
悲觀鎖:spa
Java在JDK1.5以前都是靠 synchronized 關鍵字保證同步的,這種經過使用一致的鎖定協議來協調對共享狀態的訪問,能夠確保不管哪一個線程持有共享變量的鎖,都採用獨佔的方式來訪問這些變量。獨佔鎖就是一種悲觀鎖,因此能夠說:synchronized是悲觀鎖 。線程
Q2:設計
synchronized內置鎖對象
用處:
synchronized做爲線程同步的關鍵字,設計到鎖的概念,Java內置鎖是一個互斥鎖,這就說明最多隻有一個線程可以得到該鎖,例如線程A 和 線程B,若是線程A嘗試去得到線程B的內置鎖,則線程A必須等待或者阻塞,直到線程B釋放這個鎖爲止;若是線程B永不釋放這個鎖,那麼線程A將永遠處於等待或者阻塞狀態。Java的對象鎖和類鎖在鎖的概念上,與內置鎖幾乎是一致的,可是對象鎖和類鎖的區別是很是大的。
對象鎖:
用synchronized關鍵字修飾非靜態方法、用synchronized(this)做爲同步代碼塊,用synchronized(非this對象)的用法,鎖的是對象,線程想要執行對應的同步代碼,須要先得到對象鎖。
類鎖:
用synchronized修飾靜態方法、用synchronized(類.class)的用法,鎖的是類,線程想要執行對應的同步代碼,須要先得到對象鎖。
對象鎖:鎖的是類的對象實例;
類鎖:鎖的是每一個類的Class對象,每一個類的Class對象在虛擬機中只有一個,因此類鎖也只有一個。
Q3:
樂觀鎖必定就是好的嗎?
樂觀鎖避免了悲觀鎖獨佔對象的現象,同時也提升了併發性能,可是也有如下幾個缺點:
1. 樂觀鎖只能保證一個共享變量的原子操做。若是多一個或者幾個變量,樂觀鎖將變得力不從心;
(但互斥鎖能輕易解決,無論對象數量多少以及對象顆粒度大小。)
2. 長時間自旋可能致使開銷大。假如CAS長時間不成功就會一直自旋,會給CPU帶來很是巨大的開銷
3. ABA問題。CAS的核心思想是經過對比內存值與預期值是否一致而判斷內存值是否被改動過,但這個判斷邏輯不夠嚴謹,例如:假如A同窗倒了一杯水放桌子上,而後有事去忙,此時B同窗通過,看到桌子上的水,而後喝了半杯,喝完後再將水打滿,實際看起來仍是一杯水,可是這杯水已經不是A同窗的那一杯水了,且實際上水是已經被B同窗改過了,這種狀況對依賴過程值的情景的運算結果影響很大。
解決的方案:經過引入版本號,每次變量更新都把版本號加1.
Q4:
線程池的啓動策略?
線程池的執行過程.png
2. 當調用 execute() 方法添加一個任務時,線程池會作以下判斷:
明天,會介紹多線程一些深刻的知識,長按二維碼關注我吧~
祝你們都能拿到心儀的offer!
若是以爲文章不錯,歡迎關注、點贊、收藏,大家的支持是我創做的動力,感謝你們。
若是文章寫的有問題,請不要吝嗇,歡迎留言指出,我會及時覈查修改。
若是你還想更加深刻的瞭解我,能夠微信搜索「Java極客思惟」進行關注。天天8:00準時推送技術文章,讓你的上班路不在孤獨,並且每個月還有送書活動,助你提高硬實力!