java學習(十八)

1、爲什麼MyISAM不支持行鎖,而InnoDB支持。

InnoDB之所以可以鎖行,是因爲Innodb的主索引結構上,既存儲了主鍵值,又直接存儲了行數據,可以方便的鎖住行數據,而MyIsam索引指向另一片數據文件,沒有辦法精確鎖住數據段。

2、mysql中表鎖和行鎖的區別

行鎖

特點:鎖的粒度小,發生鎖衝突的概率低、處理併發的能力強;開銷大、加鎖慢、會出現死鎖

加鎖的方式:自動加鎖。對於UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及數據集加排他鎖;對於普通SELECT語句,InnoDB不會加任何鎖。

表鎖

特點:開銷小、加鎖快、無死鎖;鎖粒度大,發生鎖衝突的概率高,高併發下性能低

加鎖的方式:自動加鎖。查詢操作(SELECT),會自動給涉及的所有表加讀鎖,更新操作(UPDATE、DELETE、INSERT),會自動給涉及的表加寫鎖。

3、哪些場景需要加表鎖

適用場景:有大量按索引條件併發更新少量不同數據,同時又有併發查詢的應用

適用場景:以查詢爲主,只有少量按索引條件更新數據的應用

4、spring優點是什麼,說一下ioc、aop。

spring的依賴注入將對象之間的依賴關係交給了框架來處理,減小了各個組件之間的耦合性;

AOP面向切面編程,可以將通用的任務抽取出來,複用性更高;

spring對於其餘主流框架提供了很好的支持,代碼的侵入性很低。

IOC:也叫控制反轉,將對象之間的依賴關係交給Spring容器,使用配置文件來創建所依賴的對象,由主動創建對象改爲了被動方式,實現解耦合。可以通過註解@Autowired和@Resource來注入對象,被注入的對象必須被下邊的四個註解之一標註:

@Controller

@Service

@Repository

@Component

DI:和控制反轉是同一個概念的不同角度的描述,即應用程序在運行時依賴IOC容器來動態注入對象需要的外部資源(對象等)。

AOP:面向切面編程是指當需要在某一個方法之前或者之後做一些額外的操作,比如說日誌記錄、權限判斷,異常統計等,可以利用AOP將功能代碼從業務邏輯代碼中分離出來。

5、阻塞io和非阻塞io說一下,非阻塞io優點是什麼。怎麼去監聽,怎麼實現非阻塞的?

阻塞io:最傳統的一種IO模型,即在讀寫數據過程中會發生阻塞現象。

當用戶線程發出IO請求之後,內核會去查看數據是否就緒,如果沒有就緒就會等待數據就緒,而用戶線程就會處於阻塞狀態,用戶線程交出CPU。當數據就緒之後,內核會將數據拷貝到用戶線程,並返回結果給用戶線程,用戶線程才解除block狀態。

非阻塞io:當用戶線程發起一個操作後,並不需要等待,而是馬上就得到了一個結果。如果結果是一個error時,它就知道數據還沒有準備好,於是它可以再次發送同樣的操作。一旦內核中的數據準備好了,並且又再次收到了用戶線程的請求,那麼它馬上就將數據拷貝到了用戶線程,然後返回。所以事實上,在非阻塞IO模型中,用戶線程需要不斷地詢問內核數據是否就緒,也就說非阻塞IO不會交出CPU,而會一直佔用CPU。

BIO:同步並阻塞,服務器實現模式爲一個連接一個線程,即客戶端有連接請求時服務器端就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
NIO:同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啓動一個線程進行處理。
AIO:異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理。
非阻塞io優點:非阻塞IO的讀、寫、接收連接是不會產生阻塞的

  • 傳統IO在處理數據傳輸請求時,針對每個傳輸請求生成一個線程,如果IO異常,那麼線程阻塞,在IO恢復後喚醒處理線程。在同時處理大量連接時,會實例化大量的線程對象。每個線程的實例化和回收都需要消耗資源,jvm需要爲其分配TLAB,然後初始化TLAB,最後綁定線程,線程結束時又需要回收TLAB,這些都需要CPU資源。
  • NIO使用selector來輪詢IO流,內部使用poll或者epoll,以事件驅動形式來相應IO事件的處理。同一時間只需實例化很少的線程對象,通過對線程的複用來提高CPU資源的使用效率。
  • CPU輪流爲每個線程分配時間片的形式,間接的實現單物理核處理多線程。當線程越多時,每個線程分配到的時間片越短,或者循環分配的週期越長,CPU很多時間都耗費在了線程的切換上。線程切換包含線程上個線程數據的同步(TLAB同步),同步變量同步至主存,下個線程數據的加載等等,他們都是很耗費CPU資源的。
  • 在同時處理大量連接,但活躍連接不多時,NIO的事件響應模式相比於傳統IO有着極大的性能提升。
  • NIO還提供了FileChannel,以zero-copy的形式傳輸數據,相較於傳統的IO,數據不需要拷貝至用戶空間,可直接由物理硬件(磁盤等)通過內核緩衝區後直接傳遞至網關,極大的提高了性能。
  • NIO提供了MappedByteBuffer,其將文件直接映射到內存(這裏的內存指的是虛擬內存,並不是物理內存),能極大的提高IO吞吐能力。

當連接不多時,並且每個連接都很活躍時,阻塞IO性能可能比非阻塞要好

通過Selector、及Selector的select操作,我們能遍歷出當前有哪些事件準備好了,比如客戶端連接過來了、客戶端有數據過來了、可以往客戶端發送數據了。

6、內部類瞭解嗎?匿名內部類瞭解嗎?

內部類應該是一個類當中的一個類,相當於一個類進行了嵌套,就如同循環的嵌套一般。內部類有一個特徵:內部類當中可以調用外部類當中的屬性和方法,而外部類卻不能調用內部類當中的。

匿名內部類 :是內部類的簡化寫法。它的本質是一個 帶具體實現的 父類或者父接口的 匿名的 子類對象。

匿名內部類的定義格式:
接口名稱 對象名 = new 接口名稱() {
// 覆蓋重寫所有抽象方法
};

對格式“new 接口名稱() {…}”進行解析:

  • new代表創建對象的動作
  • 接口名稱就是匿名內部類需要實現哪個接口
  • {…}這纔是匿名內部類的內容

匿名內部類可以繼承兩類數據結構:

  • 抽象類
  • 接口。

注意:

匿名內部類,在【創建對象】的時候,只能使用唯一一次。
如果希望多次創建對象,而且類的內容一樣的話,那麼就需要使用單獨定義的實現類了。
匿名對象,在【調用方法】的時候,只能調用唯一一次。
如果希望同一個對象,調用多次方法,那麼必須給對象起個名字。
匿名內部類是省略了【實現類/子類名稱】,但是匿名對象是省略了【對象名稱】。

7、spring bean的生命週期說一下

首先需要分清是哪種情況下的bean生命週期:

  • ApplicationContext作爲Spring容器。這裏,我們講的是 ApplicationContext中Bean的生命週期。
  • BeanFactory中Bean的生命週期 ,只不過處理器需要手動註冊。

  • 實例化一個Bean,也就是我們通常說的new
  •  
  • 按照Spring上下文對實例化的Bean進行配置,也就是IOC注入
  •  
  •  如果這個Bean實現了BeanNameAware接口,會調用它實現的setBeanName(String beanId)方法,此處傳遞的是Spring配置文件中Bean的ID
  •  
  •  如果這個Bean實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(),傳遞的是Spring工廠本身(可以用這個方法獲取到其他Bean)
  •  
  • 如果這個Bean實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文,該方式同樣可以實現步驟4,但比4更好,以爲ApplicationContext是BeanFactory的子接口,有更多的實現方法
  •  
  • 如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時調用After方法,也可用於內存或緩存技術
  •  
  • 如果這個Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法
  •  
  • 如果這個Bean關聯了BeanPostProcessor接口,將會調用postAfterInitialization(Object obj, String s)方法(注意:以上工作完成以後就可以用這個Bean了,那這個Bean是一個single的,所以一般情況下我們調用同一個ID的Bean會是在內容地址相同的實例)
  • 當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean接口,會調用其實現的destroy方法
  •  
  • 最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法

如果應用Spring的工廠也就是BeanFactory的話去掉第5步---如果這個Bean實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文,該方式同樣可以實現步驟4,但比4更好,以爲ApplicationContext是BeanFactory的子接口,有更多的實現方法就Ok了。

8、spring bean的類型有哪些。

  • 普通bean:<bean  id=""  class="A"> ,spring直接創建A實例,並返回。
  • FactoryBean:是一個特殊的bean,具有工廠生成對象的能力,只能生成特定的對象。bean必須使用 FactoryBean接口,此接口提供方法 getObject() 用於獲得特定bean。

<bean   id="" class="FB"> 先創建FB實例,使用調用getObject()方法,並返回方法的返回值

FB fb = new FB();

return fb.getObject();

BeanFactory 和 FactoryBean 對比?

BeanFactory:工廠,用於生成任意bean。

FactoryBean:特殊bean,用於生成另一個特定的bean。例如:ProxyFactoryBean ,此工廠bean用於生產代理。

<bean  id=""   class="....ProxyFactoryBean"> 獲得代理對象實例,AOP使用。

9、Spring中涉及的設計模式。

簡單工廠、單例模式、適配器模式、裝飾器模式、代理模式、觀察者模式、策略模式、模版方法模式。

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