我們在提到線程安全的時候,會選擇鎖的方法來解決。在java中鎖的類型對應被分成了六種,我們接觸了兩種最多的鎖方法是lock和synchronized,這也是面試中最常問到的原理和作用機制題目。下面我們就Java中鎖的常見面試題帶來展示,大家也來看看自己能否全部答出。
1.synchronized作用於靜態方法和非靜態方法的區別
非靜態方法:
給物件加鎖(可以理解為給這個物件的記憶體上鎖,注意只是這塊記憶體,其他同類物件都會有各自的記憶體鎖),這時候在其他一個以上執行緒中執行該物件的這個同步方法(注意:是該對象)就會產生互斥
靜態方法: 相當於在類別上加鎖(*.class位於程式碼區,靜態方法位於靜態區域,這個類別產生的物件公用這個靜態方法,所以這塊內存,N個物件來競爭),
這時候,只要是這個類別產生的物件,在呼叫這個靜態方法時都會產生互斥。即該類別所有的物件都共用一把鎖。
2.鎖型有哪些
(1)樂觀鎖&悲觀鎖
(2)自旋鎖&非自旋鎖
(3)可重入鎖&不可重入鎖
(4)無鎖&輕量級鎖&偏向鎖&重量級鎖
(5)互斥鎖&共享鎖
(6)公平鎖&非公平鎖
3.線程同步的幾種方式
synchronized修飾
volatile實現同步(只能保證可見性,不能保證原子性)
使用局部變數ThreadLocal
使用原子類別( AtomicInteger、AtomicBoolean…)
使用Lock
使用容器類別( BlockingQueue、ConcurrentHashMap)
4.synchronized 和lock 機制區別
synchronized 原始採用的是CPU 悲觀鎖定機制,即執行緒獲得的是獨佔鎖。獨佔鎖意味著其他執行緒只能依靠阻塞來等待執行緒釋放鎖。
Lock 用的是樂觀鎖方式。所謂樂觀鎖就是,每次不加鎖而是假設沒有衝突而去完成某項操作,如果因為衝突失敗就重試,直到成功為止。樂觀鎖實現的機制就是CAS 操作(Compare and Swap)。
5.說說線程安全的問題
線程安全是多線程領域的問題,線程安全可以簡單理解為一個方法或一個實例可以在多線程環境中使用而不會出現問題。
在Java 多執行緒程式設計當中,提供了多種實作Java 執行緒安全性的方式:
最簡單的方式,使用Synchronization 關鍵字
使用java.util.concurrent.atomic 套件中的原子類,例如AtomicInteger
使用java.util.concurrent.locks 套件中的鎖
使用線程安全的集合ConcurrentHashMap
使用volatile關鍵字,保證變數可見性
以上就是Java中鎖的面試題介紹,大家對於自己不清楚的知識點,一定要及時的找資料進行解決,加強有關鎖內容的記憶。