sychronized面試問題淺析

    先說下面試吧,總體來講基礎準備好點,簡歷別太假,而後回答起來實事求是,表現天然的點基本上都沒問題吧(針對初級職位,記得有個hr說過對於新人基礎紮實和爲人真誠是最關鍵的),兩天時間跑起來挺累,反而以爲面試時挺輕鬆的。 

1、sychronized相關 java

    這個很常見,面試基本上都會問到多線程這一塊,而多線程重點則是同步這一塊,因此sychronized基本上必問。對於sychronized的通常用法,你們都知道,無非就是修飾方法和修飾代碼塊的區別,以及類、對象、靜態方法同步時的一些常見問題,這裏再也不贅述,如不清楚可參考下邊連接。可是對於以下的問題,你是否能搞清楚呢? 面試

一、sychronized均可以同步什麼?
    sychronized基本用法就是修飾方法和代碼塊,可是面試官說類、對象、方法、代碼塊均可以。這一點讓我很迷惑,由於我歷來沒見過sychronized能夠修飾類和對象的。再回去的路上我忽然注意到,他問的是同步,而不是修飾,這樣一想,他的問題就一下在明瞭了,看以下代碼就明白了:
多線程

//1、修飾方法
public synchronized void test1() {
     XXX...;
}

//2、修飾代碼塊
//一、同步類
synchronized(Object.getClass()){
}

//二、同步對象
synchronized(Object){
}

//三、常規的同步代碼塊,可是其實當所處方法爲普通方法時,this就是當前對象;爲靜態方法時,this是當前類
synchronized(this){
}
二、 sychronized同步代碼塊和同步 對象有什麼不一樣?
    其實這個應該是問上邊代碼中二.2和二.3有什麼不一樣(當所處方法爲靜態的時,爲 二.1和二.3 ),其實對於 sychronized而言,二者處理是同樣的,不一樣之處在於一個是當前對象,一個是其餘對象。
    首先,咱們來分析下sychronized(Object)到底有什麼做用。
sychronized(Object)在執行時會嘗試獲取Object的對象鎖,而這回產生兩個做用:一、一個對象內的同步代碼(方法)只有獲取對象鎖的線程才能執行,不然就會被阻塞。二、只有獲取對象鎖的線程能夠進入sychronized(Object{}中的代碼塊{}。這樣來看。二者的區別就很明顯了(假設當前對象爲A,同步Object爲B):
  • 當B爲this(A=B=this)時,只有獲取A鎖的線程能夠執行sychronized代碼塊,同時其餘線程在調用A內其餘同步塊時一樣會被阻塞。
  • 當B爲其餘對象時,只有獲取B鎖的線程能夠執行sychronized代碼塊,同時其餘線程能夠調用A內其餘同步塊(同步鎖不爲B的鎖),而且其餘全部須要獲取B鎖的同步塊將會被阻塞。
    總感受仍是沒說明白,若是不清楚能夠自行查資料,這一塊用着看似簡單,可是其實道道挺多的。此外感受這兩個問題仍是頗有水平的,可以很容易區分你是否真的對多線程有不少經驗,通常狀況下咱們簡單的使用很難注意到這些細節。
相關文章
相關標籤/搜索