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類似的操作