java學習(二十二)

1、synchronized和可重入鎖的區別

可重入性:
ReenTrantLock和synchronized使用的鎖都是可重入的,兩者都是同一個線程每進入一次,鎖的計數器都自增1,所以等到鎖的計數器下降爲0時才能釋放鎖。

synchronized由編譯器加鎖和釋放,默認是非公平鎖,ReenTrantLock手動加鎖和釋放鎖。
ReenTrantLock獨有的能力:
ReenTrantLock可以指定是公平鎖還是非公平鎖,synchronized只能是非公平鎖,所謂的公平鎖就是先等待的線程先獲取鎖。
ReenTrantLock提供了中斷鎖和等待鎖的功能,通過lock.lockInterruptibly()實現中斷鎖,通過lock.tryLock()實現等待鎖。
ReenTrantLock提供了一個Condition類,實現了線程之間的通信。

什麼情況下使用ReenTrantLock:
如果應用中需要有排隊功能,比如客服分配,必須先到先得服務,不能出現餓死現象,可以使用ReenTrantLock的公平鎖,new ReenTrantLock(true)表示公平鎖。

2、synchronized加在static關鍵字前和普通方法前的區別

synchronized關鍵字加到static靜態方法上是給Class類上鎖,簡稱類鎖(鎖的是當前類的字節碼)

而加到非static靜態方法是給對象加鎖

3、 除了垃圾回收,還有那些工作會造成CPU負載過高.

我們平常也肯能遇到代碼中有比較耗時的計算。

排查過程:

  • 執行top -c ,顯示進程運行信息列表。鍵入P (大寫p),進程按照CPU使用率排序
  • top -Hp 10765 ,顯示一個進程的線程運行信息列表。鍵入P (大寫p),線程按照CPU使用率排序(進程10765內,最耗CPU的線程PID爲10804,一般超過80%就是比較高的,80%左右是合理情況。)
  • 將線程PID轉化爲16進制:printf “%x” 10804。(10804對應的16進制是0x2a34,當然,這一步可以用計算器。)
  • jstack 10765 | grep ‘0x2a34’ -C5 --color

找到了耗CPU高的線程對應的線程名稱“AsyncLogger-1”,以及看到了該線程正在執行代碼的堆棧。

4、String a = “abc”;和String b = new String(“abc”);是不是一樣的?爲什麼?他們對應的內存空間分別是什麼?

String是final的,它存儲在方法區的常量區,在定義a的時候,先去常量池找是否存在“test”常量,如果有就直接指向常量池的“test";如果沒有,就在常量池存一個爲“test"常量;

new 一個String對象的時候,這個時候會在堆內存中創建一個String 對象;但是a 依然指向的是常量池中的“test”,所以此時的a和b不是指向內存中的同一個地址,結果爲false。

5、equals()與==的區別

  • 根類object中的equals()與==沒有區別:

    如普通類Person中:
    Person per1 = new Person("張三",20);
    Person per2 = new Person("張三",20);
    System.out.print(per1.equals(per2));的結果爲true。

  • String類改寫了Object的equals();

    ==是指對內存地址的值進行比較
         equals()是對字符串的內容進行比較 
    如:String str1="hello";
           String str2=new String("hello");
           String str3=new String("hello").intern();
           System.out.print(str1.equals(str2));的結果爲true,因爲內容相同;
 System.out.print(str1==str2);的結果爲false,因爲str1爲引用類型;"hello"會直接進入對象池(堆內存)中,而str2中的不會入池。二者的地     址當然不一樣。
而經手動入池的str3保證了其地址的值相同

故:System.out.print(str1==str3);的結果爲true。

6、byte a = 127; byte b = 127; a+=b和a = a+b的區別分別會出現什麼問題

byte的範圍爲-128~127。

a+=b:編譯器幫我們進行了強制類型轉化

a=a+b:編譯錯誤,需要強制類型轉換。

若結果正確,得-2;

7、AOP的兩種實現方式。

基於XML配置的Spring AOP

採用聲明的方式實現(在XML文件中配置),大致步驟爲:配置文件中配置pointcut, 在java中用編寫實際的aspect 類, 針對對切入點進行相關的業務處理。

使用註解配置AOP

採用註解來做aop, 主要是將寫在spring 配置文件中的連接點寫到註解裏面。

8、說一些Spring的事務傳播機制。

REQUIRED

    定義:如果有事務則加入事務,如果沒有事務,則創建一個新的(默認值)

NOT_SUPPORTED

    定義:Spring不爲當前方法開啓事務,相當於沒有事務

REQUIRES_NEW

    定義:不管是否存在事務,都創建一個新的事務,原來的方法掛起,新的方法執行完畢後,繼續執行老的事務

MANDATORY

    定義:必須在一個已有的事務中執行,否則報錯

NEVER

    定義:必須在一個沒有的事務中執行,否則報錯

SUPPORTS

    定義:如果其他bean調用這個方法時,其他bean聲明瞭事務,則就用這個事務,如果沒有聲明事務,那就不用事務

NESTED

    定義:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與REQUIRED類似的操作

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