最近面試又被synchronized虐,該怎麼辦好?

1、面試被問synchronized,你真的回答對了嗎

首先認識synchronized是什麼,爲什麼要用它,它能給我們帶來什麼好處?

synchronized關鍵字是用來解決在多線程之間訪問資源的下得到同步性的,就是當被synchronized修飾的方法或者代碼塊時,它會保證任意時刻只能有一個線程執行。這樣就確保線程互斥的訪問同步代碼、保證共享變量的修改能夠及時可見、有效解決重排序問題。

2、你是如何使用synchronized加鎖的

  • 修飾實例方法:作用於當前對象實例加鎖,進入同步代碼前獲得當前對象實例的鎖
  • 修飾靜態方法:給當前類加鎖,會作用於類的所有對象實例,因爲靜態成員不屬於任何一個實例對象
  • 修飾代碼塊:指定加鎖對象,給定對象加鎖,進入同步代碼庫前要獲取給定對象的鎖

但是在使用的時候要注意一點,就是儘量不要使用synchronized(String s),因爲JVM中字符串常量池具有緩存功能。

3、那你和我聊聊synchronized底層原理

  • 同步方法塊是通過 monitorenter 和 monitorexit 指令獲取線程的執行權,
    • 注:當執行monitorenter指令時,線程就會獲取monitor的持有權。當monitor爲0時則成功獲取 ,獲取後就將鎖計數爲1,相當加1嘛。然後執行相應的monitorenter指令後,將鎖計數器設爲0,就表明鎖被釋放,如果獲取鎖失敗那當前線程就會進入阻塞狀態,等到鎖被另一個線程釋放爲止。
  • 同步方法通過加 ACC_SYNCHRONIZED 標識實現線程的執行權的控制,也就是JVM通過ACC_SYNCHRONIZED來辨別一個方法是否聲明爲同步方法,從而執行相應的同步調用。

4、JDK 1.6之後,synchronized底層做了那些優化

JDK1.6中對鎖的實現引入了大量的優化,比如偏向鎖、輕量級鎖、自旋鎖、鎖消除等技術減少鎖操作的開箱的。其實鎖主要存在四種狀態依次是無鎖狀態、偏向鎖狀態、輕量級鎖狀態和重量級鎖狀態。它們之間通過競爭的激烈而逐漸升級,鎖可以升級不可降級,目的就是爲了提高獲得鎖和釋放鎖的效率。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章