疏漏總結(十二)

  1. Java的條件變量是什麼

條件變量的出現是爲了更精細控制線程等待與喚醒,在Java5之前,線程的等待與喚醒依靠的是Object對象的wait()和notify()/notifyAll()方法,這樣的處理不夠精細。
通熟易懂的說,就是消費者/生產者的場景中,在原來的基礎上,增加了隊列滿時及時通知消費者,隊列空時及時通知生產者的優化,通常是兩個條件變量一起出現,一個控制值,但兩個條件變量可以毫無關係,終歸來說還是在Lock的範圍內。所以,從本質上來說,是對Object監視器的場景性優化,而不是全新機制的引入。

  1. TCP四次揮手的時候close-wait過多怎麼辦

服務器中CLOSE_WAIT狀態過多說明服務器沒有返回ack給客戶端,要保證使用完連接之後釋放連接,進入time wait的狀態。

  1. volatile爲什麼不能保證原子性

讀寫可以原子,有計算就不行了。

  1. spring是如何解析xml的

BeanDefinition在Spring中有三個實現,RootBeanDefinition,ChildBeanDefinition,和GenericBeanDefinition
父<bean>用rootBeanDefinition,子<bean>用Child承載,GenericBeanDefinition是2.5版本後新增的文件配置屬性定義類,是一站式服務類

  1. ORM是怎麼實現的

首先要做到的是解析配置文件和數據庫建立連接,配置文件可以是xml,可以是properties,也可以是yml等等,根據封裝好的一些類,比如getProperties或者getName去捕捉到標籤,或者關鍵字,然後進行組裝拼接,就像我們平時的jdbc去set屬性一樣。

然後解析Java的類文件,進行映射,利用jdk自帶的反射機制,得到類的信息,包括類只用的修飾符、方法、屬性、繼承的父類以及實現接口等信息。反射機制相關的類有Class、Field、Method以及Constructor等。我們可以首先通過以上方法獲取類中的屬性名,然後拼寫成setXXX和getXXX方法名,最後根據方法名執行對應的方法,將數據庫數據加載到對象中。

  1. 在分佈式環境下如何設計接口才能做到冪等性。

冪等性,通俗的說就是一個接口,多次發起同一個請求,必須保證返回結果必須準確,比如訂單接口,不能多次創建訂單,支付寶回調接口可能會多次回調,你要保證你的業務處理準確且操作只能執行一次。

冪等性有幾條方案:
(1)對於要操作的數據,在表中建立唯一索引字段。
(2)加入版本號
(3)可以在外部存儲中設置一個單獨的去重表,比如使用redis,每次請求過來,生成唯一的key。
(4)基於業務狀態進行判斷,設計接口的時候,對於每一個業務操作能否操作,設置可以執行的狀態,比如使用狀態機模式,便於檢查業務對象的狀態,接受到請求要進行一些業務處理時,可以先行判斷業務對象的狀態,是否滿足執行操作的條件,如果當前操作已經執行過了,那麼狀態就會發生變化,也就不能進行當前操作,直接返回。

  1. 什麼是深拷貝,什麼是淺拷貝

淺拷貝—能複製變量,如果對象內還有對象,則只能複製對象的地址

深拷貝—能複製變量,也能複製當前對象的 內部對象

  1. 如何自己實現一個RPC

socket+代理

  1. 爲什麼鎖膨脹

“因爲thin-lock沒有足夠空間來存儲額外狀態,所以在遇到某個鎖實際上有contention的情況下,如果不膨脹,實質上就要迫使所有在等待這把鎖的線程都要spin-wait,有可能會非常非常低效。”thin-lock膨脹到fat-lock(HotSpot VM裏的ObjectMonitor)就有了更多存儲空間,可以存下諸如native mutex之類的OS提供的同步原語對象的指針,可以在contended的情況下更高效地實現線程等待。

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